2012-09-19 13 views
8

Mam katalogi tymczasowe pełne śmieci, wszystkie rozpoczynające się od __temp__ (np. __temp__user_uploads), które chcę usunąć za pomocą funkcji czyszczenia. Moja funkcja próba jest uruchomienie:Jak mogę użyć polecenia `find` w systemie Linux, aby usunąć niepuste katalogi?

find . -name __temp__* -exec rm -rf '{}' \; 

Jeśli uruchomić polecenie i istnieje wiele __temp__ katalogi (__temp__foo i __temp__bar), pojawia się komunikat:

find: __temp__foo: unknown option 

Jeśli uruchomić komendę i tam jest tylko 1 __temp__ katalog (__temp__foo), zostanie on usunięty i pojawia się komunikat:

find: ./__temp__foo: No such file or directory 

Dlaczego polecenie nie działa, dlaczego jest niespójne, i jak mogę to naprawić?

Odpowiedz

25

Użyj przeszukiwanie w głąb i cytatów (lub ucieczki) metaznak powłoki *:

find . -depth -name '__temp__*' -exec rm -rf '{}' \; 

Objaśnienie

Bez flagi -depth, twoja komenda find usunie pasujące nazwy plików, a następnie spróbuj zejść do (teraz niepołączonych) katalogów. To jest początek "Brak takiego pliku lub katalogu" w twoim pojedynczym przypadku katalogowym __temp__.

Bez cytowania lub ucieczki *, powłoka będzie rozwijać ten wzór, dopasowując kilka __temp__whatever nazwy plików w bieżącym katalogu roboczym. To rozszerzenie wprawi w błąd find, która oczekuje na liście argumentów opcji zamiast nazw plików.

+6

Jako poprawa wydajności i szczelności, zakładając narzędzia GNU (ponieważ OP jest na Linuksie), naprawdę poleciłbym 'find. -maxdepth 1 -type d -name '__temp __ *' -print0 | xargs -0 rm -rf'. – pilcrow

+0

+1 za sugerowanie xargs zamiast -exec –

+0

@AshishKumar - dlaczego +1 dla xargs? Czy '-exec' nie jest dobrą cechą' find'? Pilcrow, dzięki za wyjaśnienie! – orokusaki

Powiązane problemy