Entpacken Sie alle Dateien in einem Verzeichnis

202

Ich habe ein Verzeichnis mit ZIP-Dateien (erstellt auf einem Windows-Computer). Ich kann sie manuell mit entpacken unzip filename, aber wie kann ich alle ZIP-Dateien im aktuellen Ordner über die Shell entpacken?

Verwenden von Ubuntu Linux Server.

Lennie De Villiers
quelle

Antworten:

394

Dies funktioniert in Bash, gemäß diesem Link :

entpacke \ *. zip

ChristopheD
quelle
2
Ich brauchte den Backslash mit Zsh . Ich weiß nicht, warum Sie es brauchen würden, wenn Sie Bash verwenden.
Don McCurdy
Was passiert mit doppelten Dateien? Ich denke, es wird nur überschreiben?
Kerner1000
Funktioniert hervorragend unter macOS 😀
Ahi Tuna
1
Wenn ich das tue, bekomme ich einen Dateinamen, der nicht für alle Zip-Dateien im Verzeichnis
übereinstimmt
1
Die Version mit Anführungszeichen hat bei mir in der WSL funktioniert. Die Dateinamen enthielten auch Leerzeichen, FWIW.
Max Candocia
107

Geben Sie einfach ein paar Anführungszeichen ein, um dem Platzhalter zu entkommen:

unzip "*.zip"
Ghostdog74
quelle
2
+1 Dieser hat für mich funktioniert. Ich musste Dateinamen mit einem bestimmten Format entpacken und den Rest einschränken. Ich habe das passende Format nur in doppelten Anführungszeichen gehalten und es hat wie ein Zauber funktioniert. Die Ausgabe gibt an, wie viele Archive erfolgreich verarbeitet wurden.
Lalit Kumar B
Funktionierte wunderbar unter Ubuntu für Windows, 18.11.2008. Top Antwort hat nicht funktioniert.
Julianstanley
64

Das folgende Bash-Skript extrahiert alle Zip-Dateien im aktuellen Verzeichnis in neue Verzeichnisse mit dem Dateinamen der Zip-Datei, dh:

Die folgenden Dateien:

myfile1.zip
myfile2.zip 

Wird extrahiert zu:

./myfile1/files...
./myfile2/files...

Shell-Skript:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done
CONvid19
quelle
4
Dies ist die Sache, um alle Dinge zu erobern. Ich kann nicht glauben, dass es nicht höher gewählt wurde
billynoah
Dies betrifft keine Leerzeichen in Dateinamen.
David Oliver
1
"
Fügen Sie
1
Das hat mir den Tag gerettet! Vielen Dank! Ich mache eine Schleife, entpacke, führe eine Aktion aus, kopiere, grep etwas, entferne. Was fehlte, war, wie man von file.gz zu file als Variable im Bash-Skript wechselt
thahgr
38

entpacke * .zip oder wenn sie sich in Unterordnern befinden, dann so etwas wie

find . -name "*.zip" -exec unzip {} \;
Phatmanace
quelle
Unzip führt die Platzhalterverarbeitung durch, sodass eine Datei mit dem Namen "* .zip" nicht das tut, was Sie erwarten.
Geocar
3
Tatsächlich wird dies genau das tun, was erwartet wird. Das Ergebnis der Suchoperation wird an unzip übergeben
John Bargman,
1
Dadurch werden alle Zip-Dateien im aktuellen Verzeichnis extrahiert. Was ist, wenn die Zip-Dateien (in Unterordnern vorhanden) in den jeweiligen Unterordnern extrahiert werden sollen?
Rishabh Agrahari
2
@RishabhAgrahari Ich habe Ihren Kommentar in einer neuen Antwort angesprochen .
Jojo
gzip'edVerwenden Sie für Dateien das gunzip -rfk .rekursive Entpacken in den entsprechenden Ordnern
Devaroop,
17

Entpacken Sie alle .zipDateien und speichern Sie den Inhalt in einem neuen Ordner mit demselben Namen und im selben Ordner wie die .zipDatei:

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Dies ist eine Erweiterung der Antwort von @ phatmanace und der Adressen von @ RishabhAgrahari :

Dadurch werden alle Zip-Dateien im aktuellen Verzeichnis extrahiert. Was ist, wenn die Zip-Dateien (in Unterordnern vorhanden) in den jeweiligen Unterordnern extrahiert werden sollen?

Jojo
quelle
1
gzip'edVerwenden Sie für Dateien das gunzip -rfk .rekursive Entpacken in den entsprechenden Ordnern
Devaroop,
2
Anfahrt find: illegal option -- nmit UnZip 6.00 - jemand anderes?
DannyDannyDanny
find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Sie haben die Verzeichnisliste vergessen.
SaundersB
16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Dadurch werden alle Zip-Archive in neue Ordner entpackt, die mit den Dateinamen der Zip-Archive benannt sind.

a.zip b.zip c.zipwird jeweils in a b cOrdner entpackt .

Jahid
quelle
6

aunpack -e *.zipmit atoolinstalliert. Hat den Vorteil, dass es intelligent mit Fehlern umgeht und immer in Unterverzeichnisse entpackt, es sei denn, die Zip-Datei enthält nur eine Datei. Somit besteht keine Gefahr, das aktuelle Verzeichnis mit Massen von Dateien zu verschmutzen, wie dies bei unzipeiner Zip- Datei ohne Verzeichnisstruktur der Fall ist.

Kampu
quelle
6

In jeder POSIX-Shell wird dies für jede Zip-Datei in ein anderes Verzeichnis entpackt:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
Jeff Fisher
quelle
1
Oder als for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
Einzeiler
2

Benutze das:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
Ankit Malhotra
quelle
2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done

Anurag Dalia
quelle
1
Großartig für mich. Entpacken Sie in ihren Unterordnern jeweils
Insign
Es ist sicherer, es for file in *.zip; do ...richtig zu machen?
Peterflynn
1

Wenn die Dateien sind gzip'd. Dann benutze einfach:

gunzip -rfk .

aus dem Stammverzeichnis, um rekursiv Dateien in den jeweiligen Verzeichnissen zu extrahieren, indem die ursprünglichen beibehalten werden (oder entfernen -k, um sie zu löschen)

Devaroop
quelle
0

Dies ist eine Variante der Antwort von Pedro Lobito , bei der ein Verzeichnis rekursiv durchlaufen wird, um Dateien mit bestimmten Erweiterungslehren zu löschen :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done
Benutzer
quelle
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
quelle
14
Gefährliche Verwendung von ls. Was ist, wenn Sie eine Datei namens "-j -o -d .. jackass.zip"
Geocar
-2

Um alle Dateien in einem Verzeichnis zu entpacken, geben Sie einfach dieses cmd in das Terminal ein:

unzip '*.zip'
Yacine ELgoub
quelle
Diese Antwort ist ein Duplikat von stackoverflow.com/a/2376135/6948900
Mikhail Antonov
-3

Verwenden

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

um einen Ordner unter Linux zu entpacken

Mohit Singh
quelle
Dadurch wird nur eine einzelne Datei entpackt. Frage ist, alle Ordner zu entpacken
Vivek Panday
Um fair zu sein, der Titel „Dekomprimieren aller Dateien in einem Verzeichnis“ könnte mehrdeutig sein und bedeutet auch „Entpacken eines einzelne Archiv in ein separates Verzeichnis“.
Jdersen