find
jest bardzo przydatny do selektywnego wykonywania akcji na całym drzewie.
find . -type f -name ".Apple*" -delete
Tutaj -type f
upewnia się, że jest to plik, a nie katalog, i może nie być dokładnie tym, czego chcesz, ponieważ pominie również dowiązania symboliczne, gniazda i inne rzeczy. Możesz użyć ! -type d
, co dosłownie oznacza nie katalogi, ale możesz także usunąć znaki i zablokować urządzenia. Proponuję zajrzeć do -type
orzeczenia na stronie podręcznika dla find
.
Aby to zrobić ściśle przy użyciu symboli wieloznacznych, potrzebujesz zaawansowanej obsługi powłoki. Bash v4 ma globstar
opcję , która pozwala rekurencyjnie dopasowywać podkatalogi za pomocą **
. zsh
a ksh
także wspierać ten wzór. Korzystając z tego, możesz to zrobić rm -rf **/.Apple*
. To nie jest standard POSIX i nie jest zbyt przenośny, więc unikałbym używania go w skrypcie, ale w przypadku jednorazowej interaktywnej akcji powłoki jest w porządku.
find . -type d -name .Apple*
do pracy - zawiera listę wszystkich folderów. Jednak nie powiedzie się, gdy dodam-delete
na końcu. Po prostu wraca z podsumowaniem użytkowania. Działa na BusyBox v1.1.1. Czy to robi różnicę?-delete
nie jest również POSIX.**
został wprowadzonyzsh
na początku lat 90. Jest teraz (według kolejności chronologicznej wyglądu) również w ksh93, fish, bash i tcsh.rm -rf **/.Apple*
-delete
nie działa, użyj-exec rm -f {} +
zamiast tego.find
być gadatliwy podczas usuwania? Podejrzewam, że metoda „globstar” zrobiłaby to przez dodanie-v
przełącznika.Wystąpiły problemy podczas używania
find
z-delete
powodu celowego zachowaniafind
(tj. Odmowy usunięcia, jeśli ścieżka zaczyna się od ./, co robią w moim przypadku), jak podano na stronie podręcznika:Zamiast tego mogłem to zrobić
W twoim przypadku wydaje się, że rozwiązanie globu (gwiazdka *) było rozwiązaniem, ale chciałem udzielić odpowiedzi na wypadek, gdyby ktoś miał podobny problem.
UWAGA: Wcześniej moją odpowiedzią było wykonanie następujących czynności, ale @Wildcard zwrócił uwagę na luki w zabezpieczeniach podczas robienia tego w komentarzach.
źródło
xargs
tutaj.-exec rm -r {} \;
lub, lepiej,-exec rm -r {} +
zrobi to samo, nie zawodząc nazw plików znaków specjalnych. Zobacz, dlaczego zapętlanie wyników wyszukiwania jest złą praktyką?mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
w swoim katalogu, a następnie ponownie uruchom to samo polecenie, jeśli nie uważasz, że istnieje ryzyko utraty danych. Albo, ponieważ pytanie o Mac OSmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
. ( Ostrzeżenie: jeśli to zrobisz, usuniesz wszystkie swoje pliki.). To mój punkt.)Możliwe jest to, że nie ma nic złego w poleceniu rm / find, ale użytkownik, z którym jesteś zalogowany, tak naprawdę nie ma uprawnień do usuwania. Użyj
ls -l
do listy rzeczy z ich uprawnieniami, można zidentyfikować, kim jesteś zid
igroups
komend (albo powinna być dostępna). Jeśli jesteś „niewłaściwym użytkownikiem”, musisz albo zmienić uprawnienia / własność plików, albo przełączyć się na innego użytkownika.źródło
Próbować:
źródło
dotglob
jest tu bezużyteczne. Zobacz tę stronę, aby zobaczyć przykład działania dotglob.Proste polecenie:
Powodzenia!
źródło