Was ist der Sinn von mv -f?

34

Das GNU Coreutils Handbuch fürmv sagt:

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

Dies scheint jedoch bereits das Standardverhalten für zu sein mv, sodass die -fOption überflüssig erscheint. ZB in GNU Bash Version 4.3.11:

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

Es ist unwahrscheinlich, dass die Absicht des -fFlags besteht, einen Alias zu überschreiben alias mv="mv -i", da es mehrere Standardmethoden zum Überschreiben eines Alias ​​gibt (z. B. Verwenden \mv), die dies präziser und auf eine Weise ausführen, die über Befehle hinweg konsistent ist.

Das Handbuch stellt fest, dass: "Wenn Sie mehr als eine der Optionen -i, -f, -n angeben, wird nur die letzte wirksam." Es ist jedoch unwahrscheinlich, dass die Absicht des -fFlags ist, das -iFlag im Allgemeinen zu überschreiben . weil ein gleichwertiges Verhalten durch einfaches Verwenden erreicht werden kann mv, was viel prägnanter und verständlicher ist als das Verwenden mv -if.

Was ist in diesem Fall der Zweck der -f Flagge? Warum existiert es?

sampablokuper
quelle
6
Vorgaben sind ein heikles Geschäft. Nehmen Sie zum Beispiel ein Werkzeug mount(obwohl es bessere Beispiele gibt). Möchten Sie wirklich wissen, welche Standardeinstellungen für jede Option gelten, damit Sie bestimmen können, welche Optionen Sie festlegen müssen? Es ist eine GUTE SACHE, Optionen sowohl für die Standardeinstellung als auch für die Nicht-Standardeinstellung zu haben, sodass Sie die Option explizit festlegen können, anstatt im Kopf den Überblick über die Standardeinstellung zu behalten. Etwas, an das man sich leichter erinnern kann, als etwas, das es nicht gibt .
Wildcard
Ein gleichwertiges Verhalten kann nicht angewendet werden, wenn MV auf mv-i
PlasmaHH 16.10.15
1
IMO, es ist auch gut für die Verwendung in Skripten, weil Sie explizit sind. Es kommuniziert die Absicht ein wenig besser.
Blacklight Shining

Antworten:

41

Die Verwendung von -fist in der Manpage von 4BSD genauer beschrieben , wo die -fund-i Optionen wurden hinzugefügt:

Wenn Datei2 bereits vorhanden ist, wird sie entfernt, bevor Datei1 verschoben wird. Wenn file2 einen Modus hat, der das Schreiben verbietet, gibt mv den Modus aus und liest die Standardeingabe, um eine Zeile zu erhalten. Beginnt die Zeile mit y, erfolgt die Verschiebung. Wenn nicht, wird MV beendet.

Optionen:

-isteht für interaktiven Modus. Wenn eine Verschiebung eine vorhandene Datei ersetzen soll, wird der Benutzer durch den Namen der Datei gefolgt von einem Fragezeichen aufgefordert. Wenn er mit einer mit 'y' beginnenden Zeile antwortet, wird der Zug fortgesetzt. Bei jeder anderen Antwort wird die Verschiebung verhindert.

-fsteht für Kraft. Diese Option setzt alle Moduseinschränkungen oder den -iSchalter außer Kraft .

Eine noch genauere Definition der Funktionsweise von mv enthält der POSIX-Standard , der hinzufügt, dass er -fnur dann außer Kraft gesetzt wird, -iwenn er später in der Befehlszeile auftritt.

Das Standardverhalten unterscheidet sich also ein wenig von -f. Standardmäßig werden Sie nur dann um Bestätigung gebeten, wenn das Ziel nicht beschreibbar ist. (Dieses Verhalten geht mindestens bis zu V4 zurück , wo mvkeine Optionen ausgewählt wurden.) Wenn die -iOption angegeben ist, fordert mv zusätzlich eine Bestätigung an, sobald das Ziel vorhanden ist. Die -fOption verhindert in beiden Fällen das Fragen (falls es danach auftritt -i).

Mark Plotnick
quelle
Tolle Antwort, danke! NB Einige Dateisysteme (z. B. CIFS) können zu unerwartetem Verhalten führen (dh zu einem anderen Verhalten als im Handbuch), z. B. als ob das -fFlag verwendet worden wäre, selbst wenn es nicht verwendet worden wäre .
Sampablokuper
Es ist erwähnenswert, dass viele Implementierungen nur dann um Bestätigung bitten, wenn sie in einem interaktiven Terminal zu sein scheinen ( isatty(0)). Auch wenn es stimmt, dass ein späteres -fÜberschreiben vorliegt -i, bedeutet dies möglicherweise nicht, dass dies dasselbe ist, als wenn keine Argumente angegeben werden.
Phk
15

Dies ist nützlich, wenn Sie die Ausführung mvauf einen vernünftigen Standardwert festgelegt haben:

alias mv="mv -i"

Wenn Sie dann einen Zug erzwingen möchten, funktioniert Folgendes:

mv -f

Da es die letzte Option im erweiterten Befehl ist, die zählt:

mv -i -f

Dieser Punkt wird auch im GNU Coreutils-Handbuch erwähnt .

Alexander
quelle
1
Danke, aber aus Gründen, die ich jetzt der Frage hinzugefügt habe, scheint es unwahrscheinlich, dass das Überschreiben alias mv="mv -i"der Grund für die Existenz von ist -f.
sampablokuper
12
Ich lehne es ab, das Standardverhalten von mv(1)(und anderen Unix-Befehlen) als "wahnsinnig" zu bezeichnen, wie Sie
meinen
1
vonbrand, obwohl ich die direkte Reaktion von Linux / UNIX-Befehlen ohne zu schätzen weiß, -iglaube ich, dass jeder, der die Befehlszeile seit mehr als ein paar Jahren benutzt, von mvirgendwann einmal verbrannt wurde .
Alexander
1
Sie mögen denken, dass es unwahrscheinlich ist, -i außer Kraft zu setzen, aber genau deshalb würde ich vermuten, dass -f so verwendet wird.
Walter
11

Es existiert, weil (man mv )

Wenn Sie mehr als eine angeben -i, -f,-n , nur der letzte wirksam wird .

Sie können also ein Skript / einen Alias ​​/ eine Funktion haben, die immer fragt, aber Sie können die Option trotzdem überschreiben.

# alias
alias mv='mv -i'

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

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

Eine sinnvolle Funktion / ein sinnvolles Skript würde natürlich mehr bewirken (z. B. die Aktion protokollieren).

Choroba
quelle
@choroba Danke, aber aus Gründen, die ich jetzt zu der Frage hinzugefügt habe, scheint es unwahrscheinlich, dass übergeordnete Aliase wie alias mv="mv -i"der Grund für die Existenz von -f. Sie erwähnen jedoch auch Skripte und Funktionen. Könnten Sie bitte Beispiele mit diesen beiden nennen?
Sampablokuper
@sampablokuper: aktualisiert.
Choroba
@choroba, nochmals vielen Dank. Leider wird weder von Ihrem Funktionsbeispiel noch von Ihrem Skriptbeispiel Gebrauch gemacht mv -f, daher ist mir immer noch unklar, wie sie ihre Existenz rechtfertigen / erklären. Entschuldigung, wenn ich das Offensichtliche verpasse!
Sampablokuper
@sampablokuper: Sie alle nutzen mv -i. Wenn Sie sie verwenden möchten, aber die Interaktion überspringen, verwenden Sie MV -fusw.
Choroba
1
@sampablokuper Das Verhalten mvohne eine dieser Optionen ist manchmal zu fragen (Ziel nicht beschreibbar und interaktives Terminal), daher wäre dies ein deutlicher Unterschied zwischen mv -fund \mv.
Phk
5

Der mvBefehl selbst kann mit dieser -fOption unterschiedlich funktionieren , da er versucht, schreibgeschützte Dateien ohne Aufforderung zu überschreiben.

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

Aufgrund von Schreibrechten im Verzeichnis kann Benutzer2 Benutzer1-Dateien in überschreiben ./dir/, wird jedoch vorher gewarnt. -fverhindert die Warnung.

Centimane
quelle
-1

Bei der Shell-Programmierung wird häufig -f verwendet, um sicherzustellen, dass Ihre Befehle nicht mit Fehlern abgebrochen werden, oder um das Skript / den Benutzer nach interaktiven Antworten zu fragen, wenn bestimmte Befehle ausgeführt werden. Das Letzte, was Sie möchten, ist, dass Ihr Skript pausiert und auf Benutzereingaben wartet, oder schlimmer noch, dass der falsche Befehl die Standardeingaben übernimmt.

Hinweis: Das Rückgängigmachen eines Alias ​​kann Nebenwirkungen verursachen / beseitigen. Wenn Sie den Befehl auf eine andere Version oder mit zusätzlichen Optionen verschoben haben, führt das Aufheben des Alias ​​zu unerwünschten Nebenwirkungen. Möglicherweise haben Sie ein Alias-Setup mit mv und rm, um einen Papierkorb (oder andere Schutz- / Verfolgungssysteme) zu verwenden. Das Rückgängigmachen des Alias ​​wird dies brechen ...

Walter
quelle
Nitpick: Die -fOption für cp oder mv garantiert nicht, dass "sie funktionieren". Wenn beispielsweise die Berechtigung nicht ausreicht, funktioniert der Befehl -f nicht. Was Sie damit meinen, ist, dass -f ein Überschreiben ohne Aufforderung erzwingt. Das gegenteilige Flag -i bedeutet, dass interaktives Überschreiben erforderlich ist.
Eric Leschinski
Zwei Dinge, die zu beachten sind: 1.) Implementierungen testen normalerweise, ob Sie sich überhaupt in einem interaktiven Terminal ( isatty(0)) befinden. Wenn Ihr Skript z. B. als Teil einer Pipe ausgeführt wird, wird es nicht ausgelöst. 2.) Das Hinzufügen -fist nicht dasselbe wie das Rückgängigmachen, -ida es mv -i -fsich von unterscheidet mv, siehe Marks Antwort .
Phk