Komprimieren Sie ein Archiv, ohne das übergeordnete Verzeichnis einzuschließen

30

Ich möchte viele Ordner in einem Verzeichnisbaum wie diesem komprimieren

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Wenn ich versuche, es zu komprimieren, wird die Erstellung eines ZIP-Archivs mit dem Ordner v anstelle des Inhalts (der Unterverzeichnisse und Dateien) beendet.

Wie kann ich das vermeiden?

Dami
quelle

Antworten:

23

Wenn ich das richtig verstehe, versuchen Sie, die Dateien und Ordner in einem bestimmten Ordner zu archivieren, ohne jedoch den Stammordner einzuschließen.

Beispiel:

/test/test.txt
/test/test2.txt

Wobei test.txt und test2.txt im zip gespeichert wären, aber nicht / test /

Sie könnten in das Verzeichnis / test / cd dann so etwas wie ausführen,

zip -r filename.zip ./*

Welches würde ein Archiv im gleichen Ordner mit dem Namen filename.zip erstellen. Oder wenn Sie es von außerhalb des Ordners ausführen, den Sie ausführen könnten,

zip -r test.zip test/*

Das / * ist der Teil, der nur den Inhalt des Ordners anstelle des gesamten Ordners enthält.

Bearbeiten: OP wollte mehrere Reißverschlüsse, Lösung endete ein bisschen ein Hack, ich bin gespannt, ob es einen besseren Weg gibt, dies zu tun.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;
zzbomb
quelle
Ja, aber ich habe eine Menge Dateien, auf denen ich das Gleiche mache, also wäre es mühsam, dies so zu tun, als gäbe es ein Bash-Skript oder etwas, das den gleichen Prozess in dem Verzeichnis automatisiert, in dem sich alle Ordner befinden
Dami,
1
Ok, ich habe das Skript ausgeführt und es hat ein übergeordnetes Verzeichnis im Archiv erstellt. Ich möchte, dass nur der Inhalt des Ordners im Archiv ist
Dami
1
Mein Fehler, etwas verpasst. hat einen -j-Parameter hinzugefügt, den ich gerade nachgeschlagen habe, überspringt anscheinend den Teil, den Sie nicht wollen. Versuchen Sie for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
Folgendes
18
zip -r test.zip test / * von außen fügt test als Verzeichnis in die zip-Datei ein
smihael
4
wie @smihael sagte, zip -r test.zip test/*funktioniert nicht. Gibt es einen richtigen Weg, um dies von außerhalb des Verzeichnisses zu erreichen?
Andrhamm
22

Verwenden Sie die Option -joder --junk-pathsin Ihrem zip-Befehl.

Von der Zip-Manpage :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).
robrtsql
quelle
Dies scheint die richtige Antwort zu sein.
mutant_city
3
Was ist mit verschachtelten Pfaden / Ordnern?
GuyPaddock
3
Dadurch werden alle Ordner im Archiv ausgelassen. Wenn Sie doppelte Dateinamen in verschiedenen Ordnern haben, wird dies in die Luft gejagt. Dies hat seinen Platz, aber nur, wenn Sie sich nicht für Ordner interessieren und nur Dateien möchten. Nicht das, was die OP verlangte, aber immer noch gute Kenntnisse
Govind Rai
17

Wie wäre es mit diesem Befehl?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
aluc
quelle
5
Obwohl dies eine korrekte Antwort ist, hört sich die Einführung nicht so an, als ob Sie selbst überzeugt wären. Es würde auch helfen, ein wenig zu erklären, was der Befehl tut.
Nephente
1
Dies war auch meine Lösung, aber ich mag es nicht, weil es beinhaltet cd. Ich hatte gehofft, dass es eine Möglichkeit gibt, den gespeicherten Pfad genauer anzugeben.
Nilskp
3

Hoffe das hilft.

(cd directory && zip -r ../out.zip .)

Es hält die Haupt-Shell im selben Verzeichnis und ändert nur das Verzeichnis der Sub-Shell, die nach dem Befehl stirbt.

Kenneth
quelle
Ich wollte dies als Kommentar zu @Alfred UCs Antwort hinzufügen , aber ich habe nicht genug Ruf dafür.
Kenneth
Wenn es das Problem tatsächlich löst, kann es eine Lösung sein.
Yufenyuy Veyeh Dider 22.
Das ist besser als eine Antwort. Funktioniert das sowohl in bash als auch in sh?
Arlen Beiler