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

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

Advertisement

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?

Advertisement

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
Advertisement
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
Advertisement
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
Advertisement
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
Advertisement
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
Advertisement
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.

Advertisement
Advertisement