Comment empêcher rm de signaler qu'un fichier n'a pas été trouvé?


155

J'utilise rmdans un script BASH pour supprimer de nombreux fichiers. Parfois, les fichiers ne sont pas présents, il signale donc de nombreuses erreurs. Je n'ai pas besoin de ce message. J'ai cherché dans la page de manuel une commande pour rendre rmsilencieux, mais la seule option que j'ai trouvée est -f, qui d'après la description, "ignorer les fichiers inexistants, ne jamais demander", semble être le bon choix, mais le nom ne semble pas convenir , donc je crains que cela puisse avoir des conséquences inattendues.

  • L' -foption est-elle la bonne façon de faire taire rm? Pourquoi n'est-il pas appelé -q?
  • Cette option fait-elle autre chose?

4
vous ne voulez pas utiliser -f, cela supprime le fichier que vous avez marqué comme lecture seule.
pizza

Réponses:


209

L'utilisation principale de -fest de forcer la suppression des fichiers qui ne seraient pas supprimés en utilisant rmlui-même (comme cas particulier, il "supprime" les fichiers inexistants, supprimant ainsi le message d'erreur).

Vous pouvez également simplement rediriger le message d'erreur en utilisant

$ rm file.txt 2> /dev/null

(ou l'équivalent de votre système d'exploitation). Vous pouvez vérifier la valeur de $? immédiatement après l'appel rmpour voir si un fichier a été effectivement supprimé ou non.


3
--fest valide pour GNU Coreutils rm, mais uniquement parce qu'il s'agit d'une abréviation unique pour --force. La forme courte -fest plus claire et plus portable.
Keith Thompson

Je ne suis même pas sûr de l'avoir réalisé. --fvoici juste une faute de frappe pour -f.
chepner

2
que fait le 2 2>?
Dan

@Maverick Il redirige tous les messages envoyés à stderr vers / dev / null au lieu de les envoyer au terminal.
Benjamin Nolan

73

Oui, -fc'est l'option la plus appropriée pour cela.


Certains systèmes vous inviteront quand même avec -f jusqu'à ce que vous utilisiez une barre oblique inverse.
vimdude

11
@vimdude: Ce n'est pas "certains systèmes"; ce comportement indique que vous avez une fonction shell ou un alias qui correspond rmà rm -i.
Keith Thompson

28

-f est le bon drapeau, mais pour l'opérateur de test, pas rm

[ -f "$THEFILE" ] && rm "$THEFILE"

cela garantit que le fichier existe et est un fichier normal (pas un répertoire, un nœud de périphérique, etc.)


4
Cependant, cela a une condition de concurrence et ne doit pas être utilisé dans les scripts de production.
tripleee

Je crois que ce que @tripleee souligne, c'est que le test "-f" et la suppression du fichier peuvent se terminer dans n'importe quel ordre. Une autre façon de le faire est:, if [ -f "$THEFILE" ]; then rm "$THEFILE"; fice qui rend les étapes de test et de suppression de fichier explicitement séquentielles.
robla

2
@robla ce code fait exactement la même chose avec une syntaxe plus verbeuse ... &&! = & ... Le test se produira toujours avant rm mais un processus séparé pourrait techniquement (bien que très peu probable) le supprimer avant que rm s'exécute (alors que le shell code après l'interprétation du test).
technosaurus

technosaurus - ooops, vous avez raison. Quelle est selon vous la meilleure réponse à la question de @ mmlac?
robla

3
Et juste pour confirmer, la condition de concurrence est que quelque chose pourrait supprimer le fichier entre testet rm. Il n'y a aucun moyen de rmpouvoir exécuter avant testici. Regarder avant de sauter est une erreur courante dans la programmation simultanée - vous ne pouvez plus faire confiance au résultat du "look" lorsque vous "sautez" réellement; la solution à cela est d'utiliser des opérations de verrouillage ou atomiques. C'est précisément pourquoi vous voulez rm -f, qui est un exemple de ce dernier.
tripleee le

13

\rm -f file ne rapportera jamais introuvable.


4
Le -r est inutile et dangereux.
mahemoff le

1
J'ai assumé de nombreux fichiers ou répertoires. Relisez la demande de l'utilisateur et vous avez raison, il ne demandait que des fichiers. Donc corrigé ma réponse
vimdude

Quelle est la barre oblique inverse avant le rm? s'il vous plaît les gars, j'ai besoin d'une réponse à cela. Sur Windows, la version 4.1 de cygwin ne peut pas gérer \ rm alors que 3.75 fonctionne très bien.
Ayman Salah

2
@AymanSalah La barre oblique inverse dans ce contexte échapperait à toute fonction ou alias enveloppant le réel rm(comme c'était populaire sur certains sites au début des années 1990 pour empêcher les débutants de supprimer des éléments puis d'appeler l'administrateur système pour récupérer leurs fichiers).
tripleee

Merci - cela a résolu mon problème .. apparemment, le code de sortie permet le chaînage en utilisant &&sans -f il casse une fois que le fichier n'est pas trouvé.
Igor

5

Pour ce qui est de rm -ffaire «autre chose», cela force ( -fest un raccourci pour --force) la suppression silencieuse dans des situations où rmautrement vous demanderait une confirmation. Par exemple, lorsque vous essayez de supprimer un fichier non accessible en écriture par vous d'un répertoire que vous pouvez en écriture.


-9

J'ai eu le même problème pour cshell. La seule solution que j'avais était de créer un fichier factice qui correspondait au modèle avant "rm" dans mon script.


7
Était-ce vraiment la seule solution? Avez-vous essayé rm -fou rm filename >&/dev/null?
Keith Thompson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.