Rozpakuj wszystkie pliki w katalogu

203

Mam katalog plików ZIP (utworzonych na komputerze z systemem Windows). Mogę ręcznie rozpakować je za pomocą unzip filename, ale jak mogę rozpakować wszystkie pliki ZIP w bieżącym folderze za pomocą powłoki?

Korzystanie z Ubuntu Linux Server.

Lennie De Villiers
źródło

Odpowiedzi:

395

To działa w trybie bash, zgodnie z tym linkiem :

rozpakuj \ *. zip

ChristopheD
źródło
2
Potrzebowałem odwrotnego ukośnika z Zsh . Nie znam powodu, dla którego byłbyś potrzebny, jeśli używasz Bash.
Don McCurdy
Co stanie się ze zduplikowanymi plikami? Myślę, że to po prostu zastąpi?
kerner1000
Działa świetnie na macOS 😀
Ahi Tuna
1
W ten sposób otrzymuję niezgodną nazwę pliku dla wszystkich plików zip w katalogu
thebeancounter
1
Wersja z cytatami działała dla mnie na WSL. W nazwach plików były również spacje, FWIW.
Max Candocia
107

Wystarczy wpisać kilka cytatów, aby uniknąć znaku zastępczego:

unzip "*.zip"
ghostdog74
źródło
2
+1 Ten działał dla mnie. Musiałem rozpakować nazwy plików w określonym formacie, ograniczając resztę. Po prostu zachowałem odpowiedni format w podwójnych cudzysłowach i działało to jak urok. Dane wyjściowe mówią mi o liczbie pomyślnie przetworzonych archiwów.
Lalit Kumar B,
Pięknie działał na podsystemie Ubuntu dla Windows, 18.11.2018. Najlepsza odpowiedź nie działała.
julianstanley,
64

Poniższy skrypt bash wyodrębnia wszystkie pliki zip w bieżącym katalogu do nowych katalogów z nazwą pliku zip, tj .:

Następujące pliki:

myfile1.zip
myfile2.zip 

Zostanie wyodrębniony do:

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

Skrypt powłoki:

#!/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
źródło
4
To jest rzecz, aby podbić wszystkie rzeczy. Nie mogę uwierzyć, że nie jest głosowany wyżej
billynoah
Nie dotyczy to spacji w nazwach plików.
David Oliver,
1
Wystarczy dodać cudzysłowy "do nazwy pliku
CONvid19
1
„uratował mi dzień! dzięki! Robię pętlę, rozpakuj, wykonaj akcję, skopiuj, grep coś, usuń. Brakowało sposobu przejścia z file.gz do pliku jako zmiennej w skrypcie bash
thahgr
38

rozpakuj * .zip, lub jeśli są w podfolderach, to coś podobnego

find . -name "*.zip" -exec unzip {} \;
phatmanace
źródło
unzip przetwarza symbole wieloznaczne, więc plik o nazwie „* .zip” nie spełni oczekiwań.
geocar
3
W rzeczywistości zrobi to dokładnie to, czego się spodziewano, wynik operacji wyszukiwania jest przekazywany do rozpakowania
John Bargman
1
Spowoduje to wyodrębnienie wszystkich plików zip z bieżącego katalogu. Co zrobić, jeśli chcę, aby pliki zip (obecne w podfolderach) zostały wyodrębnione w odpowiednich podfolderach?
Rishabh Agrahari,
2
@RishabhAgrahari Odpowiedziałem na twój komentarz w nowej odpowiedzi .
jojo
w przypadku gzip'edplików użyj gunzip -rfk .do rekurencyjnego rozpakowywania w odpowiednich folderach
Devaroop
17

Rozpakuj wszystkie .zippliki i zapisz zawartość w nowym folderze o tej samej nazwie i w tym samym folderze co .zipplik:

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

To jest rozszerzenie odpowiedzi @ phatmanace i adresuje komentarz @ RishabhAgrahari :

Spowoduje to wyodrębnienie wszystkich plików zip z bieżącego katalogu. Co zrobić, jeśli chcę, aby pliki zip (obecne w podfolderach) zostały wyodrębnione w odpowiednich podfolderach?

jojo
źródło
1
w przypadku gzip'edplików użyj gunzip -rfk .do rekurencyjnego rozpakowywania w odpowiednich folderach
Devaroop
2
Korzystanie find: illegal option -- nz UnZip 6.00 - ktoś jeszcze?
DannyDannyDanny
find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Zapomniałeś katalogu.
SaundersB
16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Spowoduje to rozpakowanie wszystkich archiwów zip do nowych folderów o nazwach nazw plików archiwów zip.

a.zip b.zip c.zipzostaną rozpakowane a b codpowiednio w folderach.

Jahid
źródło
6

aunpack -e *.zip, z atoolzainstalowanym. Ma tę zaletę, że inteligentnie radzi sobie z błędami i zawsze rozpakowuje się do podkatalogów, chyba że zip zawiera tylko jeden plik. Zatem nie ma niebezpieczeństwa zanieczyszczenia bieżącego katalogu masą plików, tak jak ma to miejsce w przypadkuunzip pliku zip bez struktury katalogów.

kampu
źródło
6

W dowolnej powłoce POSIX spowoduje to rozpakowanie do innego katalogu dla każdego pliku zip:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
Jeff Fisher
źródło
1
Lub jako liniowiec:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn
2

Użyj tego:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
Ankit Malhotra
źródło
2

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

Anurag Dalia
źródło
1
Świetnie dla mnie. Rozpakuj odpowiednio w podfolderach
podpisz
Bezpieczniej jest po prostu zrobić for file in *.zip; do ...dobrze?
peterflynn,
1

Jeśli pliki są gzip'd. Następnie użyj:

gunzip -rfk .

z katalogu głównego, aby rekurencyjnie wyodrębniać pliki w odpowiednich katalogach, zachowując oryginalne (lub usuń, -kaby je usunąć)

Devaroop
źródło
0

Jest to wariant Pedro Lobito odpowiedź używając Jak pętli katalogu rekursywnie usunąć pliki o określonych rozszerzeniach nauk:

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
użytkownik
źródło
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
źródło
14
Niebezpieczne użycie LS. Co zrobić, jeśli masz plik o nazwie „-j -o -d .. jackass.zip”
geocar
-2

Aby rozpakować wszystkie pliki w katalogu, po prostu wpisz to polecenie cmd w terminalu:

unzip '*.zip'
Yacine ELgoub
źródło
ta odpowiedź jest duplikatem stackoverflow.com/a/2376135/6948900
Michaił Antonow
-3

Posługiwać się

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

rozpakować folder w systemie Linux

Mohit Singh
źródło
Spowoduje to rozpakowanie tylko jednego pliku. Pytanie polega na rozpakowaniu wszystkich folderów
Vivek Panday
Szczerze mówiąc, tytuł „Rozpakuj wszystkie pliki w katalogu” może być niejednoznaczny, a także oznaczać „Rozpakuj pojedyncze archiwum do osobnego katalogu”.
jdersen