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