465 votes

Comment faire en sorte que rm ne renvoie pas d'erreur si un fichier n'existe pas?

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

rm lexer.ml interpparse.ml interpparse.mli

Je pourrais 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          Tente de supprimer les fichiers sans demander de confirma-
             tion, quelles que soient les permissions du fichier. Si le fichier
             n'existe pas, ne pas afficher de message diagnostique ou modifier le
             statut de sortie pour refléter une erreur. L'option -f remplace
             toutes les options -i précédentes.

Cela ressemble à ce que je veux, mais je ne suis pas vraiment sûr de la partie des permissions. Est-il possible de faire cela?

0 votes

Avez-vous essayé rm dans un bac à sable ? Il semble que -f fait exactement ce que vous voulez, indépendamment du globbing.

1 votes

Si les autorisations ne le permettent pas, rm le fera avec l'option -f encore essayer de le supprimer. Il échouera. Il ne vous dira pas qu'il a échoué. Utile si le nom de fichier est une variable ou un glob.

1 votes

Juste pour la complétude : il y a rm --interactive=never qui agit comme rm -f sauf qu'il renvoie un code de sortie d'erreur. voir ici pour plus de détails : unix.stackexchange.com/questions/72864/…

384voto

Mike Points 978

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

La confirmation concernant les autorisations de fichier à laquelle il se réfère est la suivante:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: supprimer le fichier régulier vide protégé en écriture `myfile'?

Ainsi, rm vous avertira si vous essayez de supprimer un fichier sur lequel vous n'avez pas les autorisations en écriture. Cela est autorisé si vous avez les autorisations en écriture sur le répertoire, mais c'est un peu étrange, c'est pourquoi rm vous met normalement en garde à ce sujet.

1 votes

La plupart, mais pas tous les systèmes demanderont (je pense). Certains nécessitent -i.

2 votes

Si vous voulez le message d'erreur, mais pas le code de sortie d'erreur, consultez la réponse de Giel Berkers. J'utilise set -e dans tous mes scripts bash pour que le script se termine après qu'une commande donne une erreur. Je veux souvent qu'un script me dise si rm a donné une erreur, mais continue quand même.

192voto

Giel Berkers Points 2029

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

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

rm -rf my/dir || true

De cette façon, lorsque l'instruction #1 échoue (renvoie une erreur), exécutez l'instruction #2, qui est simplement true.

6 votes

Il affiche l'erreur et continue l'exécution, ce qui était souhaité dans mon cas.

16 votes

Ou simplement rm -rf mon/dossier ||: pour être encore plus concis (: est une abréviation de true)

0 votes

La meilleure solution à mon avis. Il est facilement visible ce qui se passe et pourquoi le code de résultat est ignoré. J'aime ça!

88voto

Robert Li Points 979

Je suis en retard pour la fête, mais j'utilise cela tout le temps. Dans un makefile, ajoutez - au début d'une ligne pour ignorer la valeur de retour de cette ligne. Comme ceci :

\-rm lexer.ml interpparse.ml interpparse.mli

11 votes

Cela imprimera toujours une erreur dans la console, ce qui vous entraîne à ignorer les erreurs dans la sortie de la construction, ce qui n'est probablement pas ce que vous voulez. rm -rf est une meilleure option à mon avis.

0 votes

@Godsmith Je préférerais ignorer une erreur plutôt que de forcer une suppression récursive. Cela pourrait être très vilain. Et +1 pour la syntaxe spécifique au makefile

0 votes

Si rm -rf pouvait être "coquin", cela signifie que vous utilisez make en dehors d'un répertoire sous contrôle de version. Pourquoi?

24voto

user135299 Points 341

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

rm fichierquinexistepas 2> /dev/null || true

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

11 votes

Malheureusement, cela donnera toujours un code de sortie d'erreur.

8voto

Swish Points 705

Si vous trouvez un moyen de glob les noms de fichiers, 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 supprimer trop, bien sûr). De plus, -f est une façon tout à fait raisonnable d'aller, tant que vous n'espérez pas que les autorisations de fichiers vous empêcheront de supprimer un fichier que vous ne vouliez pas - si vous ne voulez pas le supprimer, ne le mettez pas dans la liste.

1 votes

Le globbing serait hors de question car il y a un fichier lexer.mll que je ne veux pas supprimer. Merci de montrer pourquoi -f est raisonnable. Je suppose que j'ai tendance à être trop prudent après trop de sudo rm -rf malavisés.

0 votes

Même pas un lexer.m? plus restrictif...? Cela attraperait lexer.ml et lexer.mz, mais pas lexer.mll ou lexer.mla.

1 votes

@JMD : Je suppose que cela dépend de votre shell et du support de la correspondance de motifs qu'il offre pour le globbing.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X