Rm non ha segnalato quando manca un file?


39

Ho uno script bash che voglio rimuovere file da varie directory. Spesso non ci saranno perché non sono stati generati e va bene. C'è un modo per ottenere che lo script non riporti quell'errore, ma se rm ha qualche altro output per segnalarlo?

In alternativa, c'è un comando migliore da usare per rimuovere il file che sarà meno rumoroso?

Risposte:


67

Usa l' -fopzione Ignorerà silenziosamente i file inesistenti.

Da man rm:

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

[La parte "mai richiesta" significa che (a) -fsovrascrive qualsiasi opzione -io -Iopzione precedentemente specificata e (b) i file protetti da scrittura verranno eliminati senza chiedere.]

Esempio

Senza -f, rmsi lamenterà dei file mancanti:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Con -f, sarà silenzioso:

$ rm -f nonesuch
$

4
Oh, sono nuovo che non ha richiesto la rimozione, non ho realizzato che ha ignorato anche inesistenti. L'ho completamente ignorato guardando l'uomo. :-) Grazie. Lo segnerò come risposta non appena mi sarà permesso.
flickerfly,

9

Se il tuo requisito è che rmnon ti lamenti dei file mancanti, ma che desideri anche qualsiasi altro output rm, il mio suggerimento sarebbe quello di testare prima l'esistenza del file di destinazione e chiamare rm( senza il -fflag) solo se il file esiste realmente.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Richiamare rm -fun file che, ad esempio, non dispone delle autorizzazioni di scrittura dell'utente, rimuoverà il file e non emetterà il normale prompt per quello scenario.

Nel caso in cui volessi utilizzare la stessa idea con più file, creerei una definizione di funzione, come:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Usalo come: qrm file1 file2-does-not-exist *.txt etc here


1
Vale la pena essere consapevole della minima possibilità di una race condition in cui il file viene eliminato (o creato) tra il test e la rimozione, ma non riesco a immaginare che sia rilevante in qualsiasi situazione tipica in cui si utilizzerebbe uno script di shell .
David Z,

7

Hai dichiarato di voler vedere altri output dal rmcomando quando lo esegui, ma l'uso -fdell'opzione li eliminerà. Dovrai filtrare STDERR per quello che vuoi, il che è un po 'complicato, dato che vuoi che tutto il resto mostri.

Ti consigliamo di utilizzare un comando come questo:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Spiegazione del comando:

  • -f l'argomento è forzare e non richiedere conferma o errori
  • 3>&1 1>&2 2>&3 3>&-è di cambiare STDOUT e STDERR per il filtraggio (puoi leggere ulteriori informazioni qui se lo desideri
  • | grep -v 'No such file or directory' sta filtrando il messaggio che non vuoi vedere

Ora, se si desidera eliminare completamente i messaggi di errore, è possibile eseguire il comando seguente:

rm filename 2> /dev/null

Questo comando reindirizza STDERR su / dev / null in modo da non vederlo quando si esegue il comando.


1
(AFAICS) rmsenza -vmai uscire allo stdout, solo allo stderr, quindi in questo caso potresti semplicemente 2>&1 | grepsenza la danza che è utile più in generale,
dave_thompson_085

4

In alternativa, è possibile utilizzare il findcomando con l' -deleteopzione. Questo (ovviamente) eliminerà solo i file che trova in modo da non avvisare mai se non lo sono. Un esempio potrebbe essere:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

che cercherebbe la /var/log/triffids/directory ed eliminerebbe tutti i file con il .logsuffisso che non sono stati modificati per più di 30 giorni.

È sempre una buona idea eseguire prima questi comandi senza l' -deleteopzione, per assicurarsi di trovare i file previsti.


Mi piace questa opzione e prenderò in considerazione un cambiamento. Grazie per averlo condiviso.
flickerfly,

3

Seleziona l' opzione --force( -f) di rm:

-f, --force

ignora file e argomenti inesistenti, non chiedere mai


2

Questo è un trucco, ma potresti sempre touchrimuovere il file. Se non esiste, verrà creato in modo da rmpoterlo rimuovere.


Mi piace questo, tranne che per le prestazioni: quanto è costoso toccare diverse K di file invece di eliminare solo quelli che non esistono?
Dani_l

0

Puoi usare -fcome vuole, secondo la pagina man:

Tentare di rimuovere i file senza richiedere conferma, indipendentemente dalle autorizzazioni del file. Se il file non esiste, non visualizzare un messaggio diagnostico o modificare lo stato di uscita per riflettere un errore. ricorda anche che l'opzione -f ha la precedenza su tutte le precedenti opzioni -i.

rm -f xyz-directory

non ti chiederà nulla e farà esattamente quello che vuoi.


-1

Ci sono due modi principali: se aggiungi l'opzione -f, non mostrerà l'errore "non esiste" e due: (funziona per quasi tutti i comandi) invece di fare semplicemente "il comando" fai "il comando 2> / dev / null "dove" il comando "è il comando che stai eseguendo.


1
Stavo evitando le tubazioni perché non voglio perdere altri errori che potrebbero emergere. Non so cosa sarebbero.
flickerfly,
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.