Nehmen wir an, ich habe eine ZIP-Datei, deren Inhalt wie folgt aussehen könnte
# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml
aber es könnte auch so aussehen
# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml
und jetzt würde ich mein Bash-Skript diese Dateien extrahieren lassen, aber in jedem Fall sollte es so extrahiert werden, /var/sample/
dass es so aussieht:
# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml
Wie geht das am besten über ein bash
Skript?
Im Moment verwende ich es, unzip
um ZIP-Dateien zu extrahieren, aber ich bin für jedes andere Befehlszeilentool offen, wenn die Verwendung damit einfacher wäre.
Antwort1
Ich würde einfach vorschlagen:
- In ein neues Verzeichnis extrahieren
- Wenn das neue Verzeichnis nach der Extraktion genau ein Unterverzeichnis enthält, verschieben Sie alle darin enthaltenen Dateien eine Ebene nach oben und entfernen Sie das ursprüngliche Unterverzeichnis.
Übrigens, ein Archiv erstellen (tar, zip, was auch immer)ohneAlle Mitglieder des Archivs in einem Unterverzeichnis zu haben istTEUFLISCH. Ich weiß nicht, warum die Leute das tun!
Antwort2
Es gibt mehrere intelligente Extraktionstools (das habe ich herausgefunden, nachdem ich selbst eines geschrieben hatte). Vielleicht möchten Sie sich dtrx
(installieren mit sudo apt-get install dtrx
) ansehen.
dtrx
stetserstellt das oberste Verzeichnis, wenn es noch nicht im Archiv vorhanden ist. Die Anpassung Ihres Bash-Wrapper-Skripts (das dtrx
anstelle von aufruft unzip
) wird dann viel einfacher, da nur die Unterverzeichnisse verschoben und das oberste Verzeichnis entfernt werden muss (da dieses immer vorhanden ist).