Elimina i file nella directory senza errori se è già vuoto


31

Come parte di uno script di distribuzione, voglio scaricare alcuni elementi memorizzati nella cache dalla mia directory temporanea. Uso un comando come:

rm /tmp/our_cache/*

Tuttavia, se /tmp/our_cacheè vuoto (abbastanza comune quando si inviano molte modifiche in rapida successione al nostro server di prova), viene stampato il seguente messaggio di errore:

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

Non è un grosso problema, ma è un po 'brutto e voglio ridurre il rapporto rumore-segnale nell'output di questo script.

Qual è un modo conciso in unix per eliminare il contenuto di una directory senza ricevere messaggi che lamentano che la directory è già vuota?

Risposte:


48

Dato che presumibilmente desideri rimuovere tutti i file senza chiedere conferma, perché non utilizzare l' -fopzione rmper ignorare i file inesistenti?

rm -f /tmp/our_cache/*

Dalla pagina man:

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

Inoltre, se potrebbero esserci delle sottodirectory /tmp/our_cache/e desideri che anche quelli e i loro contenuti vengano eliminati, non dimenticare il -rpassaggio.


3
soluzione più ovvia e non ci ho pensato! Mi sento il primo ragazzo in questo fumetto xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

Modifica 1

rimosso "tipo f

Modifica 2

Aggiunta un'opzione non standard -mindepth 1per impedire la rimozione della directory principale di ricerca (dopo aver eliminato la -type flimitazione).


Solo una nota, lascerei perdere -type fpoiché potrebbero esserci anche delle directory temporanee (anche se l'esempio nella domanda non li tiene conto, quindi probabilmente non sono lì ...)
Izkata

1
l'utilizzo -type feliminerà solo i file regolari, quindi i collegamenti simbolici, ad esempio, non verrebbero eliminati.
Huygens,

@rush Mi dispiace, non ho verificato, ma ho dato un'occhiata alle pagine man che dicono "Elimina file", senza menzionare comunque le directory. Cancella il mio commento.
Hauke ​​Laging,

1
Ciò rimuove, /tmp/our_cachequindi potresti anche farlo rm -r /tmp/our_cache. Mentre stai usando opzioni non standard, puoi usare -mindepth 1. Si noti che rm /tmp/our_cache/*, al contrario , rimuove anche le sottodirectory e il loro contenuto e file nascosti.
Stéphane Chazelas,

2

È possibile reindirizzare l'errore standard in /dev/nullmodo che non lo stampi

$  rm /tmp/our_cache/* 2>/dev/null

2
Ciò non eliminerebbe anche gli errori mostrati se, per esempio, un file non può essere eliminato perché è in uso? L'unico errore che voglio eliminare è quello mostrato se la directory di destinazione è vuota; sembra che avrebbe effetti collaterali indesiderati.
Mark Amery,

Anche se si tenta di eliminare alcuni file aperti da alcuni processi, non si riceverà alcun errore.
pradeepchhetri,

1

Un altro modo (anche se leggermente eccessivo ...):

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

questo utilizza testo [per verificare se la stringa restituita dall'esecuzione di un lsnella directory non è vuota. Quindi se, e solo se, quella stringa NON è vuota, rimuove tutto dalla directory.

NOTA: lasciare il glob fuori dal lsper eliminare l'errore di nessun file.


-1

Se il tuo script utilizza BASH puoi provare:

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

In questo modo si produrrà comunque un errore se si verifica un problema "reale" o se un file è protetto (sarà quindi necessario il -fmodificatore di rmeliminare questo tipo di file) ma si eviterà l'errore quando non è presente alcun file.

Se usi una shell diversa da BASH per i tuoi script, come zsh, ksh, puoi provare quest'altra sintassi che potrebbe essere più portabile:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.