Qual è il vero punto dell'opzione -f su rm?


14

Leggendo la pagina man di GNU coreutils per rm, una delle opzioni è -f, che secondo il manuale,

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

Ora, ho fatto alcuni test e lo dimostra davvero se uso qualcosa del genere

rm -f /nonexisting/directory/

non si lamenterà.

Cosa può davvero guadagnare qualcuno da tale opzione?

Inoltre, gli esempi più comuni di "eliminazione di directory" utilizzando rmsono simili

 rm -rf /delete/this/dir

L' -ropzione ha senso, ma -f?

Risposte:


9

Trovo che la pagina man manchi un po 'di dettagli in questo caso. L' -fopzione di rmha effettivamente alcuni casi d'uso:

  • Per evitare un codice di uscita dell'errore
  • Per evitare di essere richiesto
  • Per evitare i controlli delle autorizzazioni

Hai ragione che è inutile rimuovere un file inesistente, ma negli script è davvero conveniente poter dire "Non voglio questi file, cancellali se li trovi, ma non disturbarmi se non "non esiste". Alcune persone usano il set -eloro script in modo che si fermi su qualsiasi errore (per evitare ulteriori danni che lo script può causare), ed rm -rf /home/my/garbageè più facile di if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Una nota sui controlli delle autorizzazioni: per eliminare un file, è necessario disporre dell'autorizzazione di scrittura nella directory principale , non nel file stesso. Quindi diciamo che in qualche modo esiste un file di proprietà rootnella tua home directory e non hai sudoaccesso, puoi comunque rimuovere il file usando l' -fopzione. Se usi Git puoi vedere che Git non lascia l'autorizzazione di scrittura sui file oggetto che crea:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Quindi, se usi rm, l'unico modo per eliminare un repository Git senza usare rootè usare rm -rf.


4
-fnon evita un codice di uscita dell'errore. Se rmtenta e non riesce a rimuovere un file esistente, verrà restituito un codice di errore.
Gilles 'SO- smetti di essere malvagio'

Ho ridimensionato questa risposta perché "Per evitare un codice di uscita dell'errore" dovrebbe essere scritto come "Per evitare un codice di uscita dell'errore nel caso in cui non ci siano operandi di file o che gli operandi di file non esistano". Poiché questa risposta è scritta ora, è sbagliata.
Harold Fischer,

6

L' -fopzione elimina le richieste di conferma quando si elimina un file di sola lettura. Elimina inoltre gli errori quando uno o più file forniti non esistono.

L' -fopzione è utile quando sei consapevole che alcuni dei file che stai eliminando potrebbero essere di sola lettura e non desideri che ti venga richiesto.

L' fopzione è utile anche quando vuoi rimuovere alcuni file nel caso esistano, e non vuoi preoccuparti se esistono o no. Questo è molto comunemente usato nei makefile , per creare un comando che rimuove i file che possono essere rigenerati dai file sorgente. Ad esempio, se foo.opuò essere ricostruito da foo.c, bar.opuò essere ricostruito da bar.ce myapppuò essere ricostruito da foo.oe bar.oquindi il target del makefile

clean:
        rm -f *.o myapp

rimuove myapp, foo.oe bar.ose esistono e non si lamentano se qualcuno di loro non esiste.

-fNella maggior parte dei casi non è necessario includere le istruzioni per rimuovere un albero di directory. Può essere giustificato perché se sei sicuro di voler rimuovere l'albero delle directory indipendentemente da ciò che -fcontiene , puoi specificare di evitare di essere richiesto nel caso in cui alcuni file siano di sola lettura. Tuttavia, le persone che dicono di corsa rm -rfsono spesso solo ripetendo un incantesimo mistico per sbarazzarsi di qualcosa, indipendentemente dal fatto che le opzioni -re -fsono in realtà necessari. Se le opzioni non sono necessarie, non sono consigliabili, poiché aumentano il rischio che un errore di battitura nell'argomento distrugga qualcosa di importante.


3

Il -ipassaggio arm

In genere vedo l' -futilizzo con rmquando il rmcomando è alias in modo che includa l' -iopzione per interattivo. L' -finterruttore contrasta il -i.

Esempio

Simula il problema con l' rmessere alias rm -i.

$ alias rm='rm -i'

Crea alcuni dati falsi

$ touch afile

Ora prova a eliminarlo usando la versione alias di rm

$ rm afile 
rm: remove regular empty file `afile'?

Ora prova a usare -f

$ rm -f afile 
$

permessi

Inoltre credo che ci siano casi in cui hai accesso in sola lettura a una directory e quando tenti di eliminare i file e / o le sottodirectory in tale directory ti verrà sfidato un prompt simile di "sei sicuro?". L'uso di -fsi sbarazza di dover dire di sì.


Usando l'alias ha davvero un senso. E la tua risposta corrisponde a quello che mostro solo nelle pagine man di openbsd. Sebbene openbsd non sia GNU / Linux sembra che descriva ciò che hai appena detto. Ecco il link se qualcuno vuole controllare: [link] openbsd.org/cgi-bin/…
saliarosaurus

Con bash puoi sempre fare \rml'esecuzione senza aliasing (\ essendo una scorciatoia per commandcrearlo). Trovo che l'uso migliore -fsia nello script di shell in cui hai qualcosa come un file di blocco che può o non può esistere, -fferma l' rm: cannot remove 'file': No such file or directoryavvertimento.
Drav Sloan,

@DravSloan Sì, anche questo ha senso. Grazie per le vostre risposte sia Drav Sloan che slm
saliarosaurus il

Uso rm -fspesso sul cleanbersaglio in Makefiles
Alex il

-inon è proprio quello che -friguarda, è più un caso limite.
Gilles 'SO- smetti di essere malvagio'
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.