Usuń pliki z katalogu bez błędów, jeśli jest już pusty

31

W ramach skryptu wdrażania chcę zrzucić niektóre buforowane pliki z mojego katalogu tymczasowego. Używam polecenia takiego jak:

rm /tmp/our_cache/*

Jeśli jednak /tmp/our_cachejest puste (dość powszechne przy szybkim przekazywaniu wielu zmian w krótkim odstępie czasu na nasz serwer testowy), to wyświetla następujący komunikat o błędzie:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Nie jest to wielka sprawa, ale jest trochę brzydka i chcę zmniejszyć stosunek szumu do sygnału na wyjściu tego skryptu.

Jaka jest zwięzła metoda uniksowa usuwania zawartości katalogu bez otrzymywania wiadomości, że katalog jest już pusty?

Mark Amery
źródło

Odpowiedzi:

48

Ponieważ prawdopodobnie chcesz usunąć wszystkie pliki bez monitowania, dlaczego nie użyć -fprzełącznika, rmaby zignorować nieistniejące pliki?

rm -f /tmp/our_cache/*

Ze strony podręcznika:

-f, --force
          ignore nonexistent files, never prompt

Ponadto, jeśli w katalogu mogą znajdować się podkatalogi, /tmp/our_cache/które również chcesz usunąć i ich zawartość, nie zapomnij o -rprzełączniku.

depquid
źródło
3
najbardziej oczywiste rozwiązanie i nie myślałem o tym! Czuję się jak pierwszy facet na tym komiksie xkcd.com/399 ;-)
Huygens
6
find /tmp/our_cache/ -mindepth 1 -delete

Edytuj 1

usunięto „typ f

Edytuj 2

Dodano niestandardową opcję -mindepth 1, aby zapobiec usunięciu katalogu głównego wyszukiwania (po usunięciu -type fograniczenia).

Hauke ​​Laging
źródło
Tylko uwaga, pominęłbym, -type fponieważ mogą istnieć również katalogi tymczasowe (chociaż przykład w pytaniu ich nie uwzględnia, więc prawdopodobnie ich nie ma ...)
Izkata
1
użycie -type fspowoduje tylko usunięcie zwykłych plików, więc na przykład łącza symboliczne nie zostaną usunięte.
Huygens
@rush Niestety, nie sprawdziłem tego, ale po prostu rzuciłem okiem na strony podręcznika z napisem „Usuń pliki”, nie wspominając o katalogach. Usuwam mój komentarz.
Hauke ​​Laging 15.03.13
1
To usuwa, /tmp/our_cachewięc równie dobrze możesz to zrobić rm -r /tmp/our_cache. Podczas korzystania z niestandardowych opcji możesz skorzystać -mindepth 1. Pamiętaj, że w przeciwieństwie do tego rm /tmp/our_cache/*, usuwa również podkatalogi oraz ich zawartość i ukryte pliki.
Stéphane Chazelas
2

Możesz przekierować standardowy błąd, aby /dev/nullnie drukował tego

$  rm /tmp/our_cache/* 2>/dev/null
pradeepchhetri
źródło
2
Czy to również nie pomija błędów wyświetlanych, jeśli powiedzmy, że pliku nie można usunąć, ponieważ jest w użyciu? Jedynym błędem, który chcę ukryć, jest ten wyświetlany, jeśli katalog docelowy jest pusty; wydaje się, że miałoby to niepożądane skutki uboczne.
Mark Amery
Nawet jeśli spróbujesz usunąć jakiś plik, który otworzył jakiś proces, nie pojawi się błąd.
pradeepchhetri
1

Innym sposobem (choć nieco przesada ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

używa tego testlub [do sprawdzenia, czy ciąg znaków zwrócony po uruchomieniu lsw katalogu nie jest pusty. Wtedy, i tylko wtedy, gdy ten ciąg NIE jest pusty, usuwa wszystko z twojego katalogu.

UWAGA: pozostawienie globu poza tym lspomija błąd braku plików.

h3rrmiller
źródło
-1

Jeśli twój skrypt używa BASH, możesz spróbować:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

W ten sposób nadal pojawia się błąd, jeśli występuje „prawdziwy” problem lub plik jest chroniony (wówczas potrzebny byłby -fmodyfikator, rmaby usunąć ten typ plików), ale można uniknąć błędu, gdy nie ma tam żadnych plików.

Jeśli używasz do pisania skryptów innej powłoki niż BASH, takiej jak zsh, ksh, możesz wypróbować inną składnię, która może być bardziej przenośna:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Huygens
źródło