2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347

Come faccio a fare in modo che rm non dia un errore se un file non esiste?

Sto scrivendo un makefile che ripulirà alcuni file inutili alla fine della compilazione. Se un target è già stato fatto, ovviamente salterà quel target e il file inutile potrebbe non esserci. Quindi se faccio così:

rm lexer.ml interpparse.ml interpparse.mli
``` ```
-f Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions. If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error. The -f option overrides any
             previous -i options.

potrei avere degli errori perché uno dei file non esiste. C'è un modo per dire a rm di ignorare questi file?

Nella lettura della pagina man, vedo la seguente opzione:

&001 &001

Sembra quasi quello che voglio, ma non sono sicuro della parte dei permessi. C'è un modo per farlo?

Risposte (11)

296
296
296
2009-11-27 16:54:52 +0000

L'opzione -f è sicuramente quella che si desidera utilizzare.

La conferma sui permessi dei file a cui si riferisce è la seguente:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

Quindi rm vi avvisa se cercate di cancellare un file su cui non avete permessi di scrittura. Questo è permesso se avete i permessi di scrittura sulla directory, ma è un po’ strano, ed è per questo che rm normalmente vi avverte.

132
132
132
2015-03-09 12:39:25 +0000

Un'altra soluzione è questa: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command &003

Basta aggiungere un'indicazione OR dopo il comando:

rm -rf my/dir || true

In questo modo, quando l'indicazione #1 fallisce (lancia l'errore), eseguire l'indicazione #2, che è semplicemente true.

79
79
79
2012-12-23 23:12:06 +0000

Sono molto in ritardo per la festa, ma uso sempre questo. In un makefile, aggiungere - all'inizio di una linea per ignorare il valore di ritorno di quella linea. Così:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

Se non si desidera utilizzare l'opzione -f, un'alternativa è:

rm filethatdoesntexist 2> /dev/null

Questo impedirà semplicemente di stampare gli errori.

8
8
8
2009-11-27 16:48:43 +0000

Se si trova un modo per glob i nomi dei file, rm non si lamenterà se non riesce a trovare una corrispondenza. Quindi qualcosa come lexer.m* interpparse.*, ecc. dovrebbe funzionare per voi (attenzione a non cancellare troppo, naturalmente). Inoltre, -f è un modo perfettamente ragionevole di procedere, a patto che non speri che i permessi dei file ti salvino dalla cancellazione di un file che non volevi - se non vuoi cancellarlo, non metterlo nella lista.

6
6
6
2009-11-27 19:27:29 +0000

L'opzione -f significa che non verrà richiesto se qualcosa non è come ci si aspetta. Non significa che i permessi non siano presi in considerazione.

Se non avete abbastanza privilegi per rimuovere un file, non sarà rimosso.

Ma , se avete abbastanza privilegi per cambiare i privilegi, il vostro file sarà rimosso. Questo è il caso quando sei il proprietario di un file con permessi di sola lettura per il proprietario (-r————). Come proprietario, puoi chmod u+w, poi rimuoverlo: rm -f rimuoverà quel file.

5
5
5
2011-03-11 10:36:07 +0000

Forse potrebbe aiutare una linea simile con:

touch fakefile.exe fakefile.o && rm *.o *.exe

So che non è molto intelligente, ma fa il suo lavoro.

3
3
3
2015-06-11 13:55:15 +0000

Ecco cosa uso negli script di shell. Nasconde il messaggio di errore e il codice di errore.

rm doesnotexist 2> /dev/null || echo > /dev/null
3
3
3
2009-11-27 17:44:12 +0000

Un'alternativa:

RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli
``` &001 


Peccato che i Makefile non possano condividere le definizioni delle funzioni di shell tra le linee.
1
1
1
2017-02-02 16:11:37 +0000

si possono toccare i file prima di rmarli. che li creerebbe se non esistessero :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
1
1
2017-08-19 09:47:36 +0000

scrivere rm -rf ppp>/dev/null 2>&1you più recente ottenere il messaggio di errore si verifica il problema, se errore generare non a STDERR 2 ma STDOUT 1… Si verifica quando il comando genera non l'errore ma l'avviso. È necessario impostare il filtro e rimuovere questo messaggio. Ma questo caso è ordinario.