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 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 autorisations. Y a-t-il un moyen de faire cela?
rm
dans un bac à sable? On dirait-f
que vous faites exactement ce que vous voulez, quel que soit le dépassement.-f
toujours de le supprimer avec l' option. Ça va échouer. Il ne vous dira pas qu'il a échoué. Utile si le nom de fichier est une variable ou un glob.rm --interactive=never
qui agit commerm -f
sauf que ça retourne un état de sortie d'erreur. voir ici pour plus de détails: unix.stackexchange.com/questions/72864/…Réponses:
L'
-f
option est définitivement ce que vous voulez utiliser.La confirmation concernant les autorisations de fichiers auxquelles il fait référence est la suivante:
Alors
rm
vous avertira si vous essayez de supprimer un fichier que vous ne disposez pas des autorisations d'écriture sur. Ceci est autorisé si vous avez des autorisations d'écriture sur le répertoire mais que vous êtes un peu bizarre, c'est pourquoirm
vous en avertissez normalement.la source
-i
.set -e
dans tous mes scripts bash pour que le script se ferme après qu'une commande donne une erreur. Je veux souvent qu'un script me dise s'il yrm
a une erreur, mais continue quand même. continue.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:
De cette façon, lorsque l'instruction n ° 1 échoue (génère une erreur), exécutez l'instruction n ° 2, qui est simplement
true
.la source
rm -rf my/dir ||:
pour être encore plus concis (:
c'est courttrue
)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:la source
Si vous ne souhaitez pas utiliser l'option -f, une alternative est la suivante:
Cela empêchera simplement les erreurs d'être imprimées.
la source
Si vous trouvez un moyen de supprimer les noms de fichiers,
rm
ne vous plaindez pas s'il ne trouve pas de correspondance. Donc, quelque chose commelexer.m* interpparse.*
, etc. devrait fonctionner pour vous (faites attention, vous ne supprimez pas trop, bien sûr). En outre,-f
c’est un moyen tout à fait 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 le mettez pas de côté. dans la liste.la source
sudo rm -rf
.lexer.m?
...? Cela attraperaitlexer.ml
etlexer.mz
, mais paslexer.mll
oulexer.mla
.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 le supprimer:rm -f
supprimera ce fichier.la source
Peut-être pourrait aider une ligne similaire avec:
Je sais que ce n'est pas très intelligent, mais ça fait le travail.
la source
Une alternative:
Dommage que les Makefiles ne puissent pas partager les définitions de fonctions du shell sur plusieurs lignes.
la source
Voici ce que j'utilise dans les scripts shell. Il cache le message d'erreur et le code d'erreur.
la source
rm doesnotexist 2&> /dev/null
vous pouvez toucher les fichiers avant de les récupérer. cela les créerait s'ils n'existaient pas :-)
la source
rm -rf ppp>/dev/null 2>&1
vous écrivez plus récent get message d'erreur Un problème survient, si une erreur ne génère pas STDERR 2 mais STDOUT 1 ... Elle 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 cette affaire est ordinaire.la source
teste pour voir si le fichier existe en premier, si c'est le cas, puis le passe à 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.
ajoutez plus de clauses de test s'il y a plus de fichiers dont vous voulez être sûr.
la source