Ich habe den tar
Befehl ausprobiert, ein Archiv mit .tar
Erweiterung zu erstellen.
Bitte schauen Sie sich die folgenden Befehle an, die ich ausprobiert habe:
$ ls
abc.jpg hello.jpg xjf.jpg
$ tar -cfv test.tar *.jpg
tar: test.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls
abc.jpg hello.jpg v xjf.jpg
$ rm v
$ ls
abc.jpg hello.jpg xjf.jpg
$ tar -cvf test.tar *.jpg
abc.jpg
hello.jpg
xjf.jpg
$ ls
abc.jpg hello.jpg test.tar xjf.jpg
Warum gibt es unterschiedliche Antworten mit unterschiedlichen Optionen? dh -cfv
vs cvf
.
Nach dem, was ich in Bash-Skripten gelernt habe, spielt diese Optionssequenz keine Rolle.
tar
Implementierungen gilt (z. B. nicht für Solaris).Antworten:
Wie @jcbermu sagte, ist für die meisten Programme und in den meisten Fällen die Reihenfolge der Befehlszeilenflags nicht wichtig. Einige Flags erwarten jedoch einen Wert. Insbesondere
-f
lautet die Flagge von tar :Also,
tar
erwartet-f
einen Wert zu haben , und dieser Wert wird der Name des tarfile es schafft. Um beispielsweise alle.jpg
Dateien zu einem aufgerufenen Archiv hinzuzufügenfoo.tar
, würden Sie ausführenWas du gelaufen bist war
tar
versteht das als "create (-c
) ein Archiv namensv
(-fv
), das Dateientest.tar
und alle Endungen in enthält.jpg
.Wenn Sie dagegen ausführen
tar -cvf test.tar *.jpg
, wirdtest.tar
der Name des Archivs und*jpg
die Liste der Dateien verwendet.quelle
-c
steht eigentlich fürcreate
, nichtcompress
. Jedenfalls eine gute Antwort.tar
verarbeitet GNU seine Befehlszeilenargumente wie ein Skript - und daher ist ihre Reihenfolge im Allgemeinen sehr wichtig. Wenn sie zufällig verarbeitet würden, würde dies--checkpoint
Dinge wie Skripte oder mehrbändige Archive zur Pflicht machen , und selbst einfache Dinge wie:set file[1234]; for f do shift; set -- "$@" "-C$PWD/dir${f#file}" -x "$f"; done; tar -c . | tar "$@"
würden nicht funktionieren.-[if]
Optionen zumv
und / oderrm
.--
Flagge in einer Befehlszeile relativ zu anderen angezeigt wird, wahrscheinlich immer eine große Rolle spielen.Die Reihenfolge spielt keine Rolle, solange die Option keinen Wert benötigt. In Ihrem Fall muss -f einen Dateinamen angeben.
Im ersten Fall ( tar -cfv ) glaubt der Befehl, dass der Ausgabedateiname v ist, weil er nach -f steht .
quelle
test.tar
sie dem Archiv hinzuzufügen .test.tar
, die nicht existiert noch zum Zeitpunkt der Befehl daher eingegeben wird die Meldung « Keine solche Datei oder das Verzeichnis ». Nur pedant sein ;-).Während andere darauf hingewiesen haben, dass es so behandelt wurde
-c -f v
, sollte ich beachten, dass dies nur geschieht, weil der Bindestrich verwendet wurde und dieses Verhalten nicht für alle Versionen von tar gilt. Im Legacy-Modus (kein Bindestrich) behandelt tar das erste Argument speziell, und ein "f" oder "b" darin verbraucht die nächsten vollständigen Wörter nach den Optionen (sotar cfb file.tar 20
oder sotar cbf 20 file.tar
). Für GNU tar finden Sie weitere Details in der vollständigen Texinfo-Dokumentation, indem Sie ausführeninfo tar styles
.Im Allgemeinen sollten Sie sich nicht auf eines der beiden Verhaltensweisen verlassen und immer f als letzte Option angeben und ein Leerzeichen zwischen diesem und dem Dateinamen einfügen. (
-b
ist nur in einigen Situationen wichtig, wenn auf physische Bandlaufwerke geschrieben wird, daher kann es für diese Diskussion ignoriert werden.)quelle
sh
(und möglicherweise andere Pre-Getopt-Tools) gilt.sh -cf noglob 'echo test'
funktioniert wiesh -f -c 'echo test'
in der Bourne-Shell und Derivaten (undsh -ocC noglob 'echo test'
wiesh -o noblob -C -c 'echo test'
in den meisten Bourne-Derivaten). Beachten Sie auch, dass in einigen herkömmlichentar
Implementierungentar -cfv
dasselbe wie intar -cvf
.