web-dev-qa-db-fra.com

Comment faire en sorte que rien ne soit jamais créé?

J'écris un fichier makefile qui va nettoyer des fichiers inutiles à la fin de la compilation. Si une cible a déjà été créée, elle sera bien sûr ignorée et le fichier inutile pourrait ne pas y figurer. Donc si je fais ça:

rm lexer.ml interpparse.ml interpparse.mli

Je risque d’obtenir des erreurs car l’un des fichiers n’existe pas. Est-il possible d'indiquer à 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 autorisations. Y a-t-il un moyen de faire cela?

307
Jason Baker

L'option -f est certainement ce que vous voulez utiliser.

La confirmation concernant les autorisations de fichiers auxquelles il 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 ne disposez pas de droits en écriture. Ceci est autorisé si vous avez des autorisations d'écriture sur le répertoire mais que vous êtes un peu bizarre, c'est pourquoi rm vous en avertit normalement.

266
Dave Webb

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

Ajoutez simplement une instruction OR après votre commande:

rm -rf my/dir || true

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

110
Giel Berkers

Je suis bien en retard à la fête, mais je l'utilise tout le temps. Dans un fichier make, ajoutez - au début d'une ligne pour ignorer la valeur de retour de cette ligne. Ainsi:

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

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

rm filethatdoesntexist 2> /dev/null 

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

12
user135299

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 (attention, vous ne supprimez pas trop, bien sûr). De plus, -f est un moyen parfaitement raisonnable, tant que vous n'espérez pas que les autorisations de fichiers vous éviteront de supprimer un fichier que vous ne souhaitiez pas - si vous ne souhaitez pas le supprimer, ne mettez dans la liste.

8
Nick Bastin

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

Si vous ne disposez pas de suffisamment de privilèges pour supprimer un fichier, celui-ci ne sera pas supprimé.

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

6
mouviciel

Peut-être pourrait aider une ligne similaire avec:

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

Je sais que ce n'est pas très intelligent, mais ça fait le travail.

4
Bogdan

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 du shell sur plusieurs lignes.

3
reinierpost

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
teh_senaus

write rm -rf ppp>/dev/null 2>&1 vous obtenez un message d'erreur plus récent, get Un problème survient, si l'erreur génère non pas STDERR 2 mais STDOUT 1 ... Il se produit lorsque la commande ne génère pas d'erreur mais d'avertissement. Vous devez définir un filtre et supprimer ce message. Mais cette affaire est ordinaire.

1
Anatoly

vous pouvez toucher les fichiers avant de les récupérer. cela les créerait s'ils n'existaient pas :-)

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

test pour voir si le fichier existe en premier, si c'est le cas, puis le passer à rm. Alors les erreurs de rm seront significatives. -f ou ignorer le message d'erreur est généralement plus englobant que ce qu'une personne veut. -f pourrait faire des choses que vous ne voulez pas faire.

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

ajoutez plus de clauses de test s'il y a plus de fichiers dont vous voulez être sûr.

1
user244488