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


33

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

 unzip filename.zip

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

Почему:

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

или

 ls *.zip | xargs unzip

не работает?

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

Ответы:


48

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

$ unzip '*.zip'

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


Я не сказал это ясно, но они не все в одном каталоге. Итак, мне нужен вывод 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 {} \;

Второй вариант выглядит лучше, если файлов действительно много. (В противном случае он жаловался, что команда слишком длинная с 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

1

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

unzip -o somefiles.zip -d $directoryPath

-dуказывает каталог для извлечения, а не каталог для поиска файлов.
LegendaryDude
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.