Quel est le véritable intérêt de l'option -f sur rm?


14

En lisant la page de manuel GNU coreutils pour rm, l'une des options est -f, qui selon le manuel,

-f, --force
          ignore nonexistent files and arguments, never prompt

Maintenant, j'ai fait des tests et je montre qu'en effet, si j'utilise quelque chose comme

rm -f /nonexisting/directory/

il ne se plaindra pas.

Que peut-on vraiment gagner d'une telle option?

De plus, les exemples les plus courants de "suppression de répertoires" à l'aide de rmquelque chose comme

 rm -rf /delete/this/dir

L' -roption est logique, mais -f?

Réponses:


9

Je trouve que la page de manuel manque un peu de détails dans ce cas. L' -foption rma en fait plusieurs cas d'utilisation:

  • Pour éviter un code de sortie d'erreur
  • Pour éviter d'être invité
  • Pour contourner les vérifications d'autorisation

Vous avez raison de dire qu'il est inutile de supprimer un fichier inexistant, mais dans les scripts, il est vraiment pratique de pouvoir dire "Je ne veux pas de ces fichiers, supprimez-les si vous les trouvez, mais ne me dérangez pas s'ils ne n'existent pas ". Certaines personnes utilisent le set -edans leur script pour qu'il s'arrête en cas d'erreur (pour éviter tout dommage supplémentaire que le script peut causer), et rm -rf /home/my/garbagec'est plus facile que if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Remarque sur les vérifications des autorisations: pour supprimer un fichier, vous devez disposer d'une autorisation d'écriture dans le répertoire parent , pas sur le fichier lui-même. Disons donc qu'il y a un fichier appartenant rootà votre répertoire personnel et que vous n'y avez pas sudoaccès, vous pouvez toujours supprimer le fichier en utilisant l' -foption. Si vous utilisez Git, vous pouvez voir que Git ne laisse pas l'autorisation d'écriture sur les fichiers objets qu'il crée:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Donc, si vous utilisez rm, la seule façon de supprimer un référentiel Git sans utiliser rootest d'utiliser rm -rf.


4
-fn'évite pas un code de sortie d'erreur. Si rmtente et échoue de supprimer un fichier existant, il renverra un code d'erreur.
Gilles 'SO- arrête d'être méchant'

J'ai rétrogradé cette réponse car "Pour éviter un code de sortie d'erreur" doit être écrit comme "Pour éviter un code de sortie d'erreur dans le cas où il n'y a aucun opérande de fichier ou que les opérandes de fichier n'existent pas". Comme cette réponse est écrite maintenant, elle est fausse.
Harold Fischer

6

L' -foption supprime les invites de confirmation lors de la suppression d'un fichier en lecture seule. Il supprime également les erreurs lorsqu'un ou plusieurs fichiers fournis n'existent pas.

L' -foption est utile lorsque vous savez que certains des fichiers que vous supprimez peuvent être en lecture seule et que vous ne souhaitez pas être invité à le faire.

L' foption est également utile lorsque vous souhaitez supprimer certains fichiers au cas où ils existent et que vous ne voulez pas vous soucier de leur existence ou non. Ceci est très couramment utilisé dans les makefiles , pour créer une commande qui supprime les fichiers qui peuvent être régénérés à partir des fichiers source. Par exemple, si foo.opeut être reconstruit à partir de foo.c, bar.opeut être reconstruit à partir de bar.c, et myapppeut être reconstruit à partir de foo.oet bar.o, alors la cible du makefile

clean:
        rm -f *.o myapp

supprime myapp, foo.oet bar.os'ils existent et ne se plaint pas si aucun d'entre eux n'existe.

L'inclusion -fdans les instructions de suppression d'une arborescence de répertoires n'est pas nécessaire dans la plupart des cas. Cela peut être justifié car si vous êtes sûr de vouloir supprimer cette arborescence de répertoires indépendamment de ce qu'elle contient, vous pouvez spécifier -fpour éviter d'être invité au cas où certains fichiers sont en lecture seule. Cependant, les gens qui disent courir ne rm -rffont souvent que répéter une incantation mystique pour se débarrasser de quelque chose, peu importe si les options -ret -fsont réellement nécessaires. Si les options ne sont pas nécessaires, elles ne sont pas recommandées, car elles augmentent le risque qu'une faute de frappe dans l'argument détruise quelque chose d'important.


3

Le -ipassage àrm

Je vois généralement l' -futilisation avec rmquand la rmcommande est aliasée de sorte qu'elle inclut le -icommutateur interactif. Le -fcommutateur contrecarre le -i.

Exemple

Simulez le problème avec des rmalias rm -i.

$ alias rm='rm -i'

Faites de fausses données

$ touch afile

Essayez maintenant de le supprimer en utilisant la version alias de rm

$ rm afile 
rm: remove regular empty file `afile'?

Essayez maintenant d'utiliser -f

$ rm -f afile 
$

Autorisations

Je crois également qu'il existe des cas où vous avez un accès en lecture seule à un répertoire et lorsque vous essayez de supprimer les fichiers et / ou sous-répertoires dans ce répertoire, vous serez confronté à une invite similaire "êtes-vous sûr?". L'utilisation de -fse débarrasse d'avoir à dire oui.


En utilisant l'alias, cela a un certain sens. Et votre réponse correspond à ce que je viens de montrer dans les pages de manuel openbsd. Bien que openbsd ne soit pas GNU / Linux, il semble qu'il décrit ce que vous venez de dire. Voici le lien si quelqu'un veut vérifier: [link] openbsd.org/cgi-bin/…
saliarosaurus

Avec bash, vous pouvez toujours faire \rmpour exécuter sans alias (\ étant un raccourci vers le commandconstruit). Je trouve que la meilleure utilisation -fest dans les scripts shell où vous avez quelque chose comme un fichier de verrouillage qui peut ou non exister, -farrête l' rm: cannot remove 'file': No such file or directoryavertissement.
Drav Sloan

@DravSloan Oui, cela a également du sens. Merci pour vos réponses à la fois Drav Sloan et slm
saliarosaurus

J'utilise rm -fsouvent sur la cleancible en Makefiles
Alex

-ice n'est pas vraiment de quoi il -fs'agit, c'est plutôt un cas de bord.
Gilles 'SO- arrête d'être méchant'
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.