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.

Antworten:


394

Dies funktioniert in Bash, gemäß diesem Link :

entpacke \ *. zip


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"

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

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

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 {} \;

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?


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 .


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.


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

1
Oder als for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
Einzeiler


2

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


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)


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

-2
for i in `ls *.zip`; do unzip $i; done

14
Gefährliche Verwendung von ls. Was ist, wenn Sie eine Datei namens "-j -o -d .. jackass.zip"
Geocar


-3

Verwenden

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

um einen Ordner unter Linux zu entpacken


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.