Gibt es eine Möglichkeit, alle Dateien in einem bestimmten Verzeichnis mit dem zip
Befehl zu komprimieren ? Ich habe von der Verwendung *.*
gehört, möchte aber, dass es auch für Dateien ohne Dateierweiterung funktioniert.
command-line
wildcards
zip
tkbx
quelle
quelle
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
bedeutet jede Datei mit einem Punkt. In cp / m und dos hatten alle Dateien einen Punkt, und Sie mussten ihn eingeben (was nicht möglich war*
). Daher kamen die Leute, um*.*
alle Dateien zu sehen. Schließlich fügte Microsoft lange Dateinamen hinzu, die null oder mehr Punkte enthalten könnten. Um eine Datei mit einem Punkt in Windows zu finden, müssen Sie Folgendes eingeben*.*.*
.Antworten:
Sie können nur verwenden
*
; es besteht keine Notwendigkeit dafür*.*
. Dateierweiterungen sind unter Unix nichts Besonderes.*
Stimmt mit keinem oder mehreren Zeichen überein, einschließlich eines Punkts. Es passt alsofoo.png
, denn das sind null oder mehr Zeichen (sieben, um genau zu sein).Beachten Sie, dass
*
Dateien, die mit einem Punkt beginnen , standardmäßig nicht übereinstimmen (was auch nicht der Fall ist*.*
). Das ist oft was du willst. Wenn nicht, in bash, wenn Sieshopt -s dotglob
es wollen (aber immer noch ausschließen.
und..
). Andere Shells haben andere (oder gar keine) Möglichkeiten, Punktdateien einzuschließen.Alternativ gibt es
zip
auch eine-r
(rekursive) Option, um ganze Verzeichnisbäume auf einmal zu erstellen (und sich nicht um das Dotfile-Problem kümmern zu müssen):Wo
mydir
ist das Verzeichnis, in dem sich Ihre Dateien befinden? Beachten Sie, dass die erstellte Zip-Datei die Verzeichnisstruktur sowie die Dateien enthält. Wie Peterph in seinem Kommentar ausführt, wird dies normalerweise als eine gute Sache angesehen: Wenn Sie die Zip-Datei extrahieren, werden alle extrahierten Dateien in einem Unterverzeichnis gespeichert.Sie können zip auch anweisen, die Pfade nicht mit der Option
-j
/ zu speichern--junk-paths
.Der
zip
Befehl wird mit einer Dokumentation geliefert, die Sie über alle (vielen) Optionen informiert. Geben Sie einman zip
, um diese Dokumentation anzuzeigen. Dies gilt nicht nur für zip. Auf diese Weise erhalten Sie Dokumentation für die meisten Befehle.quelle
*
Beachten Sie, dass beim Shell-Globbing keine Punktdateien (dh Dateinamen, die mit beginnen.
) enthalten sind. Dies ist ein weiterer Vorteil beim Zippen des gesamten Verzeichnisses nach Namen..
und..
?In meinem Fall wollte ich jede Datei in ein eigenes Archiv packen, also habe ich folgendes (in
zsh
) gemacht:quelle
mkv
hier? Auch hier ist nichts besonderszsh
spezifisch. Sie sollten jede Variable, die einen Dateinamen enthält, korrekt in Anführungszeichen setzen. Verwenden Sie alsozip "${file%.*}.zip" "$file"
die doppelten Anführungszeichen um beide Variablen.mkv
. Zweitens ist das Zitieren von Argumenten imzsh
Gegensatz zu in unnötigbash
. Deshalb habe ich angegeben, dass dies ein Befehl für warzsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(mit-P
je nach CPU angepassten Threads ...) (Viele GNU-Abhängigkeiten ...)Eine andere Möglichkeit wäre, find und xargs zu verwenden: (Dies könnte ein "." - Verzeichnis in der Zip-Datei enthalten, das aber trotzdem korrekt extrahiert werden sollte. Bei meinem Test hat zip den Punkt vor der Komprimierung entfernt.)
find . -type f -exec zip zipfile.zip {} +
(Das
+
kann durch ersetzt werden,\;
wenn Ihre Version vonfind
das+
Ende für exec nicht unterstützt . Es wird jedoch langsamer sein ...)Dies schließt standardmäßig alle Unterverzeichnisse ein. Auf GNU find
-maxdepth
lässt sich das verhindern.quelle
*
dies Punktdateien und fällt nicht um, wenn sich zu viele Dateien in einem Verzeichnis befinden.)Eine andere (langsame) Methode, um dies zu tun (die jeweils eine Datei zur Zip hinzufügt):
Dies hat die dotfile-Probleme
*
( Problemumgehung hinzugefügt) und würde zip einmal für jede Datei starten und sie dem Archiv hinzufügen. Inbash
würde es mit einer großen Menge von Dateien umgehen.Es wäre langsamer als die meisten anderen Methoden, ist aber relativ einfach.
quelle
for f in *; do zip zip.zip "$f"; done