Quel est le point de mv -f?


34

Le manuel GNU Coreutils pourmv dit:

-f --force Do not prompt the user before removing a destination file.

Cependant, cela semble déjà être le comportement par défaut de mv, donc l' -foption semble superflue. Par exemple, dans la version 4.3.11 de GNU Bash:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

Il semble peu probable que l'intention de l' -findicateur soit de remplacer alias mv="mv -i", car il existe plusieurs méthodes standard pour remplacer un alias (par exemple, utiliser \mv) qui le feraient de manière plus concise et cohérente d'une commande à l'autre.

Le manuel indique que "Si vous spécifiez plusieurs options -i, -f, -n, seule la dernière prend effet", mais il semble toujours peu probable que le -fdrapeau ait pour objectif de remplacer le -idrapeau en général, car un comportement équivalent peut être obtenu simplement en utilisant mv, ce qui est beaucoup plus concis et compréhensible que d’utiliser mv -if.

Cela étant, quel est le but du -fdrapeau? Pourquoi existe-t-il?


6
Les valeurs par défaut sont une affaire délicate. Prenons un outil tel que mount, par exemple (même s’il existe de meilleurs exemples). Voulez-vous vraiment vous rappeler quelles sont les valeurs par défaut pour chaque option afin de pouvoir déterminer les options à définir? C’est une bonne chose d’avoir des options pour les valeurs par défaut et non par défaut. Vous pouvez donc définir explicitement l’option au lieu de devoir garder mentalement la trace de la valeur par défaut. Quelque chose , il est plus facile de se rappeler que quelque chose pas là .
Wildcard

Un comportement équivalent ne peut pas être utilisé si MV est ajusté à mv-i
PlasmaHH

1
OMI, c'est aussi agréable à utiliser dans les scripts, parce que vous êtes explicite. Il communique un peu mieux l'intention.
Blacklight Shining

Réponses:


41

L’utilisation de -fest plus clairement décrite dans la page de manuel de 4BSD, à laquelle les -fet -ioptions ont été ajoutées:

Si le fichier2 existe déjà, il est supprimé avant que le fichier 1 ne soit déplacé. Si file2 a un mode qui interdit l'écriture, mv imprime le mode et lit l'entrée standard pour obtenir une ligne; si la ligne commence par y, le déménagement a lieu; sinon, mv sort.

Options:

-ireprésente le mode interactif. Chaque fois qu'un mouvement doit remplacer un fichier existant, l'utilisateur est invité à indiquer le nom du fichier suivi d'un point d'interrogation. S'il répond par une ligne commençant par «y», le déplacement se poursuit. Toute autre réponse empêche le déplacement de se produire.

-freprésente la force. Cette option annule les restrictions de mode ou le -icommutateur.

Une définition encore plus précise du fonctionnement de mv est donnée dans la norme POSIX , qui ajoute qu’elle -fne remplace que -isi elle se produit plus tard dans la ligne de commande.

Donc, le comportement par défaut est un peu différent de -f. La valeur par défaut consiste à demander une confirmation uniquement lorsque la cible n'est pas accessible en écriture. (Ce comportement remonte au moins aussi loin que V4 , où mvn'a pas pris aucune option.) Si l' -ioption est donnée, mv demandera en outre une confirmation chaque fois que la cible existe. L' -foption empêchera de demander dans ces deux cas (si cela se produit après l'un des deux -i).


Super réponse, merci! NB: Certains systèmes de fichiers (par exemple, CIFS) peuvent amener mv à présenter un comportement inattendu (différent du manuel), par exemple en agissant comme si l' -findicateur avait été utilisé même s'il n'avait pas été utilisé .
sampablokuper

Il convient de noter que de nombreuses implémentations ne demandent une confirmation que si elles semblent être dans un terminal interactif ( isatty(0)). De plus, bien qu'il soit vrai qu'un dernier -fremplace -i, cela ne signifie peut-être pas qu'il en va de même si aucun argument n'est donné.
phk

15

C'est utile lorsque vous avez défini l'exécution de mvà une valeur par défaut:

alias mv="mv -i"

Lorsque vous voulez ensuite forcer un mouvement, cela fonctionnera:

mv -f

Comme c'est la dernière option de la commande développée qui compte:

mv -i -f

Ce point est également mentionné dans le manuel GNU Coreutils .


1
Merci, mais pour les raisons que j'ai ajoutées à la question, il semble improbable que alias mv="mv -i"la raison en soit l'existence de -f.
sampablokuper

12
Je m'oppose à l'appel du comportement par défaut "faites ce que vous êtes demandé, pas de questions idiotes" de mv(1)(et d'autres commandes Unix) "insensé" comme vous l'
imaginez

1
vonbrand, bien que j'apprécie la réponse directe des commandes Linux / UNIX sans -i, je pense que quiconque a utilisé la ligne de commande pendant plus de quelques années a été gravé mv, à un moment ou à un autre.
Alexandre

1
Vous pensez peut-être qu’il est improbable de passer outre -i, mais c’est exactement pourquoi je suppose que -f est utilisé comme cela.
Walter

11

Il existe parce que ( man mv)

Si vous spécifiez plus d'un -i, -f, -n, seul le dernier prend effet.

Ainsi, vous pouvez avoir un script / alias / fonction qui demande toujours, mais vous pouvez toujours remplacer l'option.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

Une fonction / un script significatif ferait naturellement quelque chose de plus (par exemple, enregistre l'action).


@choroba Merci, mais pour les raisons que j'ai ajoutées à la question, il semble peu probable que des alias tels que alias mv="mv -i"soit la raison de l'existence de -f. Vous mentionnez également les scripts et les fonctions. S'il vous plaît pourriez-vous donner des exemples en utilisant ces deux?
sampablokuper

@sampablokuper: mis à jour.
Choroba

@ choroba, merci encore. Malheureusement, ni votre exemple de fonction ni votre exemple de script ne sont utilisés mv -f, je ne comprends donc toujours pas comment ils justifient / expliquent son existence. Désolé si je manque l'évidence!
sampablokuper

@sampablokuper: Ils utilisent tous mv -i. Si vous voulez les utiliser mais ignorez l'interaction, vous utiliserez MV -fetc.
choroba

1
@sampablokuper Le comportement de mvsans aucune de ces options est parfois de demander (terminal non inscriptible et interactif), donc ce serait une différence claire entre mv -fet \mv.
phk

5

La mvcommande en elle-même peut fonctionner différemment avec l' -foption, en ce sens qu'elle tentera d'écraser les fichiers protégés en écriture sans invite.

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

En raison des autorisations d'écriture dans le répertoire, l'utilisateur2 peut écraser les fichiers de l'utilisateur1 ./dir/, mais il sera averti avant de le faire. -fempêche l'avertissement.


-1

En programmation shell, l'utilisation de -f est un idiome courant utilisé pour s'assurer que vos commandes n'abandonnent pas avec des erreurs ou ne demandent pas au script / à l'utilisateur une réponse interactive lors de l'exécution de certaines commandes. La dernière chose que vous souhaitiez, c’est que votre script suspende son attente en attente de la saisie de l’utilisateur, voire pire, lorsqu’une commande erronée prenne la saisie en standard.

Remarque: l' annulation d'un alias peut provoquer / supprimer des effets secondaires. Si vous avez associé la commande à une autre version ou à des options supplémentaires, l'annulation de l'alias entraînera des effets secondaires indésirables. Par exemple, vous pouvez avoir un alias avec mv et rm pour utiliser une boîte de recyclage (ou un autre système de protection / suivi). Annuler l'alias va casser ça ...


Nitpick: L’ -foption pour cp ou mv ne garantit pas qu’ils "fonctionnent". Par exemple, si l'autorisation est insuffisante, la commande -f ne le fera pas fonctionner. Ce que vous vouliez dire, c'est que -f force un écrasement sans invite. Le drapeau opposé -i signifie qu'il faut interactif lors du remplacement.
Eric Leschinski

Deux choses à noter: 1.) Normalement, les implémentations vérifieront si vous êtes même dans un terminal interactif ( isatty(0)). Ainsi, par exemple, si votre script s'exécute dans le cadre d'un canal, il ne sera pas déclenché. 2.) L'ajout -fn'est pas la même chose que l'annulation, -icar elle mv -i -fdiffère de mv, voir la réponse de Mark .
phk
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.