it-swarm-eu.dev

Vieni a fare una richiesta non osare un errore se un file non esiste?

Sto scrivendo un makefile che pulirà alcuni file inutili alla fine della compilation. Se un bersaglio è già stato fatto, ovviamente salterà quel bersaglio e il file inutile potrebbe non essere lì. Quindi se faccio questo:

rm lexer.ml interpparse.ml interpparse.mli

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

Leggendo la pagina man, vedo la seguente opzione:

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

Sembra che quasi quello che voglio, ma non sono molto sicuro della parte delle autorizzazioni. C'è un modo per fare questo?

307
Jason Baker

L'opzione -f è sicuramente quella che vuoi usare.

La conferma delle autorizzazioni sui file a cui fa riferimento è questa:

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

Quindi rm ti avviserà se tenti di eliminare un file su cui non hai permessi di scrittura. Questo è permesso se hai permessi di scrittura sulla directory ma è un po 'strano, ed è per questo che rm normalmente ti avverte.

266
Dave Webb

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

Basta aggiungere una dichiarazione OR dopo il tuo comando:

rm -rf my/dir || true

In questo modo, quando l'affermazione # 1 fallisce (genera errore), esegui l'istruzione # 2, che è semplicemente true.

110
Giel Berkers

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

-rm lexer.ml interpparse.ml interpparse.mli
74
Robert Li

Se non vuoi usare l'opzione -f, un'alternativa è:

rm filethatdoesntexist 2> /dev/null 

Ciò manterrà solo gli errori dalla stampa.

12
user135299

Se trovi 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 te (stai attento che non stai eliminando troppo, ovviamente). Inoltre, -f è un modo perfettamente ragionevole per andare, a patto che tu non speri che i permessi dei file ti salveranno dall'eliminare un file che non volevi - se non vuoi cancellarlo, non metterlo nella lista.

8
Nick Bastin

L'opzione -f significa che non ti verrà richiesto se qualcosa non è come previsto. Ciò non significa che le autorizzazioni non vengano prese in considerazione.

Se non hai abbastanza privilegi per rimuovere un file, questo non verrà rimosso.

MA, se disponi di privilegi sufficienti per modificare i privilegi, il file verrà 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, quindi rimuoverlo: rm -f rimuoverà quel file.

6
mouviciel

Forse potrebbe aiutare una linea simile con:

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

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

4
Bogdan

Un'alternativa:

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

Troppo male I Makefile non possono condividere le definizioni della funzione Shell su più righe.

3
reinierpost

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
teh_senaus

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

1
Anatoly

puoi toccare i file prima di prenderli. questo li creerebbe se non esistono :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
commonpike

prova per vedere se il file esiste prima, se lo fa, quindi passarlo a rm. Quindi gli errori di rm saranno significativi. -f o ignorando il messaggio di errore è in genere più comprensivo di quello che una persona vuole. -f potrebbe fare cose che non vuoi fare.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

aggiungi più clausole di test se ci sono più file che vuoi essere sicuro esistano.

1
user244488