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.