Ich habe ein Skript zusammengestellt, um einige Dateioperationen für mich durchzuführen. Ich verwende den Platzhalter-Operator *
, um Funktionen auf alle Dateien eines Typs anzuwenden, aber eines verstehe ich nicht. Ich kann unzip
alle Dateien in einem solchen Ordner speichern
unzip "*".zip
Um danach jedoch alle zip-Dateien zu entfernen, muss ich Folgendes tun
rm *.zip
Das heißt, die Anführungszeichen werden nicht benötigt. Das Entpacken funktioniert dagegen nicht, wenn ich nur das * gebe (warnt mich, dass "Dateien nicht übereinstimmen").
Warum ist das anders? Für mich scheint dies genau die gleiche Operation zu sein. Oder verwende ich den Platzhalter falsch?
Einführungen in die Wildcard in Unix gehen nicht wirklich darauf ein, und ich konnte in den Dokumenten rm
oder nichts finden zip
.
Ich benutze das Terminal auf einem Mac (Yosemite).
unzip
dass dies ohne die normalefor f in *.zip;do...done
Shell-Schleife möglich wäre. Solch eine seltsame, nicht unixartige Befehlszeilen-Benutzeroberfläche.unzip
Wendet den Glob auf den Inhalt eines Archivs an. Sie können sie nicht mit einem Platzhalter erhalten. (Du brauchst `` `für f inunzip -l archive.zip
; do ... done`)unzip
, dass Globs akzeptiert werden, die in einer einzelnen Zip-Datei enthalten sind. Das ist aber anders; Ich habe es tatsächlichunzip '*.zip'
in einem Verzeichnis mit mehreren Zip-Dateien versucht , und es extrahiert alle Dateien aus allen Zip-Dateien. Wie ich schon sagte, super komisch.tar
hat keine solche Betriebsart.Antworten:
Sie haben die Situation sehr gut erklärt. Das letzte Teil des Puzzles ist, dass
unzip
Wildcards selbst verarbeitet werden können:http://www.info-zip.org/mans/unzip.html
Indem Sie den Platzhalter * in Anführungszeichen setzen, haben Sie verhindert, dass Ihre Shell ihn erweitert, sodass
unzip
der Platzhalter angezeigt wird und er nach seiner eigenen Logik erweitert wird.rm
Im Gegensatz dazu werden Platzhalter allein nicht unterstützt. Wenn Sie also versuchen, einen Platzhalter in Anführungszeichenrm
zu setzen, müssen Sie stattdessen nach einem wörtlichen Sternchen im Dateinamen suchen.Der Grund, warum
unzip *.zip
dies nicht funktioniert, ist, dassunzip
die Syntax einfach nicht mehrere ZIP-Dateien zulässt. Wenn es mehrere Parameter gibt, werden für den zweiten und die folgenden Parameter Dateien im Archiv erwartet:quelle
unzip
fall die eigene sprache, in dem anderen fall den allgemeinen unix lingo?for f in *.zip ; do unzip -v "$f" ; done
. und ein großer Teil des Grundes, warum die Shell die Dateinamenerweiterung usw. selbst ausführt, ist nicht das, was jedes einzelne Programm tun muss. .Der Unterschied zwischen diesen beiden Befehlen ist das in Anführungszeichen gesetzte
*
Zeichen. Wenn Sie einen Befehl in einer Shell aufrufen und das*
Zeichen für ein Argument verwenden, wird das Argument von der Shell selbst ausgewertet. Siehe dieses Beispiel:Jetzt mit einem
*
:Die Shell wertet den Platzhalter aus und erstellt einen Befehl wie folgt:
Mit einem Platzhalter in Anführungszeichen wird es als Datei mit dem Namen (wörtlich) interpretiert
*.zip
:Das
unzip
Dienstprogramm kann nicht mit mehreren komprimierten Dateien als Argumente aufgerufen werden. Der Entwickler entschied sich jedoch für einen anderen Weg. Aus der Manpage:quelle
unzip
diesen Weg gewählt haben, anstatt mehrere gezippte Dateien als Argumente zuzulassen?Der Unterschied besteht im ersten Fall darin, dass die Shell selbst den Glob erweitert:
Im zweiten Fall tut die Anwendung selbst etwas mit diesem wörtlichen Zeichen:
Ohne Anführungszeichen erweitert die Shell zuerst den Glob, und der Befehl wird mit dem Shell-Glob ausgeführt, zu dem er erweitert wurde.
quelle
Ein Befehl erhält die Argumente, nachdem sie von der Shell verarbeitet wurden.
Bei der ersten Verarbeitung wird ein nicht
*
in Anführungszeichen gesetztes Zeichen durch die Shell erweitert (auf die Liste der Dateien im aktuellen Verzeichnis (pwd), die dem Muster entsprechen):Listet alle
.zip
Dateien auf. Aberecho "*".zip"
wird nicht .Bei der ersten Verarbeitung wird ein Anführungszeichen
"*"
nicht erweitert, sondern als Parameter an den Befehl unzip übergeben (nachdem das Anführungszeichen entfernt wurde). Der Befehl unzip erhält einen Parameter von*.zip
:Es ist der Befehl unzip, der
*
die Liste der Dateien erweitert.Interessant ist auch, dass mit diesen beiden Befehlen nicht genau dieselbe endgültige Aktion ausgeführt wird und wer die
*
Änderungen erweitert :Der erste Befehl erhält einen,
*.zip
den er erweitert, um alle Dateien zu verarbeiten. Der zweite Befehlunzip
erhält eine Liste aller.zip
Dateien im pwd, die nicht verarbeitet werden, da der Entpacker die Erweiterung mehrerer Dateien abgelehnt hatzip
.quelle
Die Anführungszeichen werden benötigt, da zip mehrere Argumente verarbeitet:
rm
: Alle Dateien in der Argumentliste entfernenzip
: entpacke die Datei im ersten Argument. extrahieren Sie nur die Dateien in den verbleibenden Argumenten.Wie Sie sehen, wird versucht, file2.zip und file3.zip in file1.zip zu finden
Damit Sie mehrere ZIP-Dateien gleichzeitig extrahieren können, unterstützt zip die Interpretation des Globus für sich mit einem anderen Ergebnis.
quelle