Come impedire a rm di segnalare che non è stato trovato un file?


155

Sto usando rmuno script BASH per cancellare molti file. A volte i file non sono presenti, quindi riporta molti errori. Non ho bisogno di questo messaggio. Ho cercato nella pagina man un comando per rendere rmsilenzioso, ma l'unica opzione che ho trovato è -f, che dalla descrizione, "ignora i file inesistenti, non chiedere mai", sembra essere la scelta giusta, ma il nome non sembra adattarsi , quindi sono preoccupato che potrebbe avere conseguenze indesiderate.

  • L' -fopzione è il modo corretto di mettere a tacere rm? Perché non si chiama -q?
  • Questa opzione fa qualcos'altro?

4
non vuoi usare -f, rimuove il file che hai contrassegnato come di sola lettura.
Pizza

Risposte:


209

L'uso principale di -fè forzare la rimozione di file che non verrebbero rimossi usando rmda soli (come un caso speciale, "rimuove" i file inesistenti, sopprimendo così il messaggio di errore).

Puoi anche reindirizzare il messaggio di errore utilizzando

$ rm file.txt 2> /dev/null

(o equivalente del tuo sistema operativo). È possibile verificare il valore di $? immediatamente dopo la chiamata rmper vedere se un file è stato effettivamente rimosso o meno.


3
--fè valido per GNU Coreutils rm, ma solo perché sembra essere un'abbreviazione unica per --force. La forma abbreviata -fè più chiara e portatile.
Keith Thompson,

Non sono nemmeno sicuro di averlo capito. --fecco solo un refuso per -f.
Chepner,

2
cosa fa il 2 in 2>?
Dan,

@Maverick Reindirizza tutti i messaggi inviati a stderr a / dev / null invece di inviarli al terminale.
Benjamin Nolan,

73

Sì, -fè l'opzione più adatta per questo.


Alcuni sistemi ti chiederanno quando spazio anche con -f finché non usi la barra rovesciata.
vimdude,

11
@vimdude: non è "alcuni sistemi"; che il comportamento indica che si dispone di una funzione di shell o alias che mappa rma rm -i.
Keith Thompson,

28

-f è il flag corretto, ma per l'operatore di test, non rm

[ -f "$THEFILE" ] && rm "$THEFILE"

questo assicura che il file esista e sia un file normale (non una directory, nodo del dispositivo ecc ...)


4
Tuttavia, questo ha una condizione di competizione e non deve essere utilizzato negli script di produzione.
triplo

Credo che @tripleee stia sottolineando che il test "-f" e la rimozione del file potrebbero essere completati in qualsiasi ordine. Un altro modo per farlo è if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi:, che rende esplicitamente sequenziali le fasi di test e rimozione dei file.
robla,

2
@robla quel codice fa la stessa cosa esatta con una sintassi più dettagliata ... &&! = & ... Il test avverrà sempre prima di rm ma un processo separato potrebbe tecnicamente (anche se molto improbabile) cancellarlo prima che rm venga eseguito (mentre la shell codice dopo l'interpretazione del test).
technosaurus,

technosaurus - ooops, hai ragione. Quale pensi sia la migliore risposta alla domanda di @mmlac?
robla,

3
E solo per confermare, la condizione di gara è che qualcosa potrebbe rimuovere il file tra teste rm. Non c'è modo di rmeseguire prima di testqui. Guardare prima di saltare è un errore comune nella programmazione concorrente: non puoi più fidarti del risultato dello "sguardo" quando effettivamente "salti"; la soluzione è quella di utilizzare operazioni di blocco o atomiche. È proprio per questo che vuoi rm -f, che è un esempio di quest'ultimo.
triplo l'

13

\rm -f file non segnalerà mai non trovato.


4
-R è inutile e pericoloso.
mahemoff,

1
Ho assunto molti file o directory. Rileggi la richiesta dell'utente e hai ragione che chiedeva solo file. Quindi corretta la mia risposta
vimdude,

Qual è la barra rovesciata prima dell'rm ?? per favore ragazzi ho bisogno di una risposta a questo. Su Windows la versione 4.1 di cygwin non è in grado di gestire \ rm mentre 3.75 funziona perfettamente.
Ayman Salah,

2
@AymanSalah La barra rovesciata in questo contesto sfuggirebbe a qualsiasi funzione o alias che avvolge il reale rm(come era popolare in alcuni siti nei primi anni '90 per impedire ai principianti di rimuovere roba e quindi richiamare il sysadmin per recuperare i loro file).
triplo l'

Grazie - questo ha risolto il mio problema .. apparentemente il codice di uscita consente il concatenamento usando &&mentre senza -f si rompe una volta che il file non è stato trovato.
Igor

5

Per quanto riguarda rm -f"qualsiasi altra cosa", forza ( -fè una scorciatoia --force) la rimozione silenziosa in situazioni in cui rmaltrimenti ti chiederebbe conferma. Ad esempio, quando si tenta di rimuovere un file non scrivibile dall'utente da una directory scrivibile dall'utente.


-9

Ho avuto lo stesso problema con cshell. L'unica soluzione che ho avuto è stata quella di creare un file fittizio che corrispondesse al modello prima di "rm" nel mio script.


7
Era davvero l' unica soluzione? Hai provato rm -fo rm filename >&/dev/null?
Keith Thompson,
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.