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

Comment faire pour que rm ne donne pas d'erreur si un fichier n'existe pas ?

Je suis en train d'écrire un makefile qui va nettoyer quelques fichiers inutiles à la fin de la compilation. Si une cible a déjà été faite, elle sera bien sûr ignorée et le fichier inutile peut ne pas être là. Donc si je fais cela :

rm lexer.ml interpparse.ml interpparse.mli

je peux obtenir des erreurs parce qu'un des fichiers n'existe pas. Y a-t-il un moyen de dire à rm d'ignorer ces fichiers ?

En lisant la page de manuel, je vois l'option suivante :

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

Cela ressemble presque à ce que je veux, mais je ne suis pas vraiment sûr de la partie concernant les autorisations. Y a-t-il un moyen de le faire ?

回答 (11)

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

L'option -f est définitivement celle que vous voulez utiliser.

La confirmation des autorisations de fichiers à laquelle elle fait référence est la suivante :

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

Donc rm vous avertira si vous essayez de supprimer un fichier sur lequel vous n'avez pas de droits d'écriture. Cela est autorisé si vous avez des droits d'écriture sur le répertoire mais c'est un peu bizarre, c'est pourquoi rm vous avertit normalement à ce sujet.

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

Une autre solution est celle-ci : https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Il suffit d'ajouter une instruction OR après votre commande :

rm -rf my/dir || true

De cette façon, lorsque l'instruction n°1 échoue (erreur de jet), exécutez l'instruction n°2, qui est simplement true.

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

Je suis très en retard à la fête, mais je l'utilise tout le temps. Dans un makefile, ajoutez - au début d'une ligne pour ignorer la valeur de retour de cette ligne. Comme ça :

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

Si vous ne voulez pas utiliser l'option -f, une alternative est :

rm filethatdoesntexist 2> /dev/null

Cela empêchera simplement les erreurs d'être imprimées.

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

Si vous trouvez un moyen d'accéder aux noms des fichiers glob , rm ne se plaindra pas s'il ne trouve pas de correspondance. Donc quelque chose comme lexer.m* interpparse.*, etc. devrait fonctionner pour vous (faites attention à ne pas trop effacer, bien sûr). De plus, -f est une solution tout à fait raisonnable, tant que vous n'espérez pas que les autorisations de fichiers vous évitent de supprimer un fichier que vous ne vouliez pas - si vous ne voulez pas le supprimer, ne le mettez pas dans la liste.

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

L'option -f signifie que vous ne serez pas invité si quelque chose n'est pas comme prévu. Cela ne signifie pas que les autorisations ne sont pas prises en compte.

Si vous n'avez pas assez de privilèges pour supprimer un fichier, il ne sera pas supprimé.

mais , si vous avez assez de privilèges pour en changer, votre fichier sera supprimé. C'est le cas lorsque vous êtes le propriétaire d'un fichier avec des permissions de lecture seule pour le propriétaire (-r———-). En tant que propriétaire, vous pouvez chmod u+w, puis le supprimer : rm -f supprimera ce fichier.

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

Peut-être que cela pourrait aider une ligne similaire à :

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

Je sais que ce n'est pas très intelligent, mais cela fait l'affaire.

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

Voici ce que j'utilise dans les scripts shell. Il cache le message d'erreur et le code d'erreur.

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

Une alternative :

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

Dommage que les Makefiles ne puissent pas partager les définitions de fonctions shell entre les lignes.

1
1
1
2017-02-02 16:11:37 +0000

vous pouvez toucher les fichiers avant de les rm. qui les créerait s'ils n'existent pas :-)

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

write rm -rf ppp>/dev/null 2>&1you newer get error message Problème se produit, si l'erreur se produit non pas à STDERR 2 mais à STDOUT 1… Il se produit lorsque la commande génère non pas une erreur mais un avertissement. Vous devez définir un filtre et supprimer ce message. Mais ce cas est ordinaire.