Распаковка пакета файлов

33

Когда я пытаюсь

 unzip filename.zip

оно работает. Однако мне нужно распаковать серию zip-файлов.

Почему:

 find . -name "*.zip" -print0 | xargs -0 unzip

или

 ls *.zip | xargs unzip

не работает?

В обоих случаях я получаю сообщение «Внимание: имя файла не совпадает:».

jeannoburto
источник

Ответы:

48

Вы можете выполнить команду:

$ unzip '*.zip'

Смотрите здесь для справки .

vfbsilva
источник
Я не сказал это ясно, но они не все в одном каталоге. Итак, мне нужен вывод find.
Жаннобурто
4
Спасибо. Это может совершенно не соответствовать актуальному вопросу, но это решило мою проблему. Я пытался, unzip *и он вернулся caution: filename not matchedдля каждого файла, но unzip '*.zip'сделал свою работу.
Иван
27

Ваши команды не работают, потому что они помещают все файлы в одну командную строку. Хотя это работает с большинством программ, unzipпервый аргумент будет приниматься как zip-файл, а любой после первого - как файлы, извлекаемые из него. Вам необходимо выполнить команду один раз для каждого файла:

find . -name "*.zip" -print0 | xargs -0 -n1 unzip

Или

find . -name '*.zip' -exec unzip {} \;
Kevin
источник
Второй вариант выглядит лучше, если файлов действительно много. (В противном случае он жаловался, что команда слишком длинная с xargs)
Recct
5

В bash вы также можете сделать следующее:

for i in *.zip; do
    unzip "$i"
done

Также unzipможно взять -dпереключатель, чтобы вы могли направить выход в разных местах.

Например:

uzdir=/path/to/unzips
for i in *.zip; do
    [ -d "$uzdir/$i" ] || mkdir -p "$uzdir/$i"
    unzip "$i" -d "$uzdir/$i"
done
SLM
источник
1

Существует гораздо более простое решение, чем приведенное выше, с использованием -dфлага каталога :

unzip -o somefiles.zip -d $directoryPath
Адитья Миттал
источник
-dуказывает каталог для извлечения, а не каталог для поиска файлов.
LegendaryDude