Розпакуйте всі файли в каталозі


203

У мене є каталог ZIP-файлів (створений на машині Windows). Я можу розпакувати їх вручну за допомогою unzip filename, але як можна розпакувати всі ZIP-файли в поточній папці через оболонку?

Використання сервера Ubuntu Linux.

Відповіді:


395

Це працює в bash, за цим посиланням :

розпакуйте \ *. zip


2
Мені знадобився зворотний нахил із Zsh . Я не знаю причини, яка вам знадобиться, якщо ви використовуєте Bash.
Дон МакКерді,

Що буде з дублікатами файлів? Гадаю, це просто перекриє?
kerner1000

Відмінно працює на macOS 😀
Ahi Tuna

1
Роблячи це, я отримую не ім’я файлу для всіх поштових файлів у каталозі
thebeancounter

1
Версія з цитатами працювала для мене на WSL. Файли файлів також мали пробіли в них, FWIW.
Макс Кандокія

107

Просто введіть кілька цитат, щоб уникнути підстановки:

unzip "*.zip"

2
+1 Цей працював на мене. Мені довелося розпаковувати назви файлів у певному форматі, обмежуючи решту. Я просто утримував формат відповідності в подвійних лапках, і він працював як шарм. Вихідна інформація повідомляє мені про кількість успішно оброблених архівів.
Лаліт Кумар Б

Прекрасно працював у підсистемі Ubuntu для Windows, 18.11.2018 Верхня відповідь не спрацювала.
julianstanley

64

Наступний скрипт bash витягує всі поштові файли в поточному каталозі до нових dirs з назвою zip-файлу, тобто:

Наступні файли:

myfile1.zip
myfile2.zip 

Буде вилучено:

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

Сценарій оболонки:

#!/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
Це річ, щоб підкорити всі речі. Не можу повірити, що не проголосували вище
billynoah

Це не стосується пробілів у назви файлів.
Девід Олівер

1
Просто додайте лапки "до імені файлу
CONvid19

1
`врятував мій день! Дякую! Я роблю певний цикл, розпаковую, виконую дію, копіюю, щось клацаю, видаляю. Не вистачало того, як перейти з file.gz у файл як змінну у скрипті bash
thahgr

38

unzip * .zip, або якщо вони є в папках, то щось подібне

find . -name "*.zip" -exec unzip {} \;

unzip виконує обробку підстановки, тому файл під назвою "* .zip" не буде робити те, що ви очікуєте.
геокар

3
Насправді це зробить саме те, що очікується, результат операції знаходження передається на розпакування
Джон Баргман

1
Це дозволить витягнути всі поштові файли в поточному каталозі, що робити, якщо я хочу, щоб файли zip (присутні у вкладених папках) були вилучені у відповідні папки?
Рішабх Аграхарі

2
@RishabhAgrahari Я звернувся з Вашим коментарем у новій відповіді .
жоджо

для gzip'edфайлів, використовуйте gunzip -rfk .для рекурсивного розпакування у відповідних папках
Devaroop

17

Розпакуйте всі .zipфайли та збережіть вміст у новій папці з тим самим назвою та в тій самій папці, що і .zipфайл:

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

Це розширення відповіді @ phatmanace та адреси @ коментаря RishabhAgrahari :

Це дозволить витягнути всі поштові файли в поточному каталозі, що робити, якщо я хочу, щоб файли zip (присутні у вкладених папках) були вилучені у відповідні папки?


1
для gzip'edфайлів, використовуйте gunzip -rfk .для рекурсивного розпакування у відповідних папках
Devaroop

2
Отримання з find: illegal option -- nдопомогою UnZip 6,00 - хто - небудь ще?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Ви забули перелік каталогів.
SaundersB

16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Це дозволить розпакувати всі архіви zip у нові папки, названі іменами zip-архівів.

a.zip b.zip c.zipбуде розпаковано a b cвідповідно до папок.


6

aunpack -e *.zip, із atoolвстановленим. Має перевагу в тому, що він розумно поводиться з помилками та завжди розпаковується в підкаталоги, якщо в zip не міститься лише один файл. Таким чином, немає небезпеки забруднити поточний каталог масою файлів, як це є unzipна zip без структури каталогів.


6

У будь-якій оболонці POSIX це відкриватиме інший каталог для кожного поштового файлу:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

1
Або як for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
однолінійний


2

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


1
Чудово для мене. Розпакуйте їх відповідно в папках
введіть

Безпечніше просто робити for file in *.zip; do ...правильно?
peterflynn

1

Якщо файли є gzip'd. Тоді просто використовуйте:

gunzip -rfk .

з кореневого каталогу рекурсивно витягувати файли у відповідних каталогах, зберігаючи оригінали (або видалити, -kщоб видалити їх)


0

Це варіант Педро лобіт відповідь , використовуючи Як перебрати каталог рекурсивно видалити файли з певними розширеннями навчань:

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
Небезпечне використання лс. Що робити, якщо у вас є файл під назвою "-j -o -d .. jackass.zip"
геокар


-3

Використовуйте

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

щоб розпакувати папку в Linux


Це розпакує лише один файл. Питання полягає в тому, щоб розпакувати всі папки
Vivek Panday

Чесно кажучи, заголовок "Розпакувати всі файли в каталозі" може бути неоднозначним, а також означати "Розпакувати один архів в окремий каталог".
jdersen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.