Распаковка нескольких файлов одновременно

У меня есть более 200 .zip файлов в одной папке. Я не хочу распаковывать их по одному. Я хочу извлечь те, которые используют одну команду или скрипт. Как это сделать.

27
задан 15.05.2020, 14:32

6 ответов

Если Вы действительно хотите распаковать их параллельно, Вы могли бы сделать

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

, Что однако, запустит процессы N для zip-файлов N. и мог быть очень тяжелым в Вашей системе. Для более управляемого подхода, запуская только 10 параллельных процессов за один раз, попробуйте это:

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

Для управления количеством параллельных запущенных процессов, изменение -P к тому, что Вы хотите. Если Вы не хотите, рекурсивно вызывают в подкаталоги, сделайте это вместо этого:

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

, С другой стороны, можно установить параллель GNU , как предложено @OleTange в комментариях и работать

parallel unzip ::: *zip
38
ответ дан 15.05.2020, 14:35
  • 1
    @PaddyLandau, не уверенный, I' d должны проверить. Это будет зависеть от скорости алгоритма распаковки по сравнению со скоростью диска I, воображают. – Liquid Core 15.05.2020, 14:35
  • 2
    @PaddyLandau единственная причина I' m передающий по каналу к xargs должен выполнить вещи в параллель как OP, который спрашивают. -exec \; (можно выйти из точки с запятой, никакой потребности в кавычках), выполнит каждую команду последовательно. -exec + лучше, но это won' t работают здесь с тех пор that' s не, как unzip работы. – Scott Barta 15.05.2020, 14:36
  • 3
    Используйте -exec или -execdir вместо того, чтобы передать по каналу к xargs. Мало того, что более просто понять, но также и it' s также менее подверженный ошибкам и использование меньше системных ресурсов. find . -name '*.zip' -exec unzip {} ';' (Необходимо заключить точку с запятой в кавычки.) – pdsafs df apk 15.05.2020, 14:36
  • 4
    Я думаю, что мы поняли OP по-другому. Вы читаете его как желание его параллельно, тогда как я понял его как значение единственной команды вместо нескольких команд. Ну, у него есть оба метода теперь:) – duncanc4 15.05.2020, 14:36
  • 5
    Выполнение параллельно является хорошей идеей, но won' t дисковый ввод-вывод быть главным узким местом? – xcvbn 15.05.2020, 14:37

unzip \*.zip или unzip '*.zip'

очевидное unzip *.zip не работает, потому что оболочка расширяется, она к unzip foo.zip bar.zip ... и unzip интерпретирует первое имя файла как zip-файл и следующие имена файлов как файлы для извлечения из того zip-файла.

Однако unzip немного необычно среди команд Unix, в которых это делает свои собственные расширения шарика. Если эти * не будет расширен оболочкой, разархивируйте, то сделает это, и intepret все получающиеся имена файлов как zip-файлы, которые будут обработаны. Таким образом в этом особом случае, можно уйти без for цикл или xargs и т.п.

1
ответ дан 15.05.2020, 14:32

параллель GNU команда хорошо подходит для этого типа вещи. После:

$ sudo apt-get install parallel

Тогда

ls *.zip | parallel unzip

Это будет использовать столько ядер, сколько Вы имеете, заставляя каждое ядро напряженно трудиться с тем, чтобы разархивировать, пока они все не сделаны.

17
ответ дан 15.05.2020, 14:33
  • 1
    It' s лучшая идея использовать echo *.zip вместо этого, чтобы препятствовать тому, чтобы возможный псевдоним ls крался в дополнительной информации. Однако это имеет ту же проблему как @Guru' s ответ, это повреждается на именах файлов, содержащих пробел. – Ambar Jain 15.05.2020, 14:33
  • 2
    @nyuszika7h В отличие от xargs Параллель GNU делает не повреждение на именах файлов, содержащих пространство/вкладку/кавычку. Только если имена файлов содержат новые строки, необходимо будет проявить дополнительную заботу. Например, при помощи: parallel unzip ::: *.zip – nktsamba 15.05.2020, 14:34
  • 3
    @NateEldredge, В то время как тот шанс был большей спиной во время, когда системы имели только один магнитный диск, в эти дни с НАБЕГАМИ с несколькими шпинделями и диском флэш-памяти, что шанс меньше. Лучшая вещь сделать состоит в том, чтобы, конечно, измерить и видеть, как Ваш система ведет себя. Я недавно использовал 40 шпинделей RAID, где оптимальный параллелизм для ввода-вывода голодные процессы равнялся 10: Это не дало 10x, убыстряются - только 6x, но меньше чем 10 процессов дали меньше, чем 6x. – Abdul Waheed 15.05.2020, 14:34
  • 4
    @nyuszika7h с помощью echo настолько же плохо как использует ls. Globbing и некоторое время цикл являются самыми безопасными. – Remian8985 15.05.2020, 14:35
  • 5
    @nyuszika7h - Это серьезные основания избежать и команды стандарта искажения, и пробелы помещения в именах файлов. – tarun713 15.05.2020, 14:35

Не терминальный метод.

Просто выбирают zip-файлы, щелкают правой кнопкой по одному и выбирают extract here. Можно выбрать все или просто много zip-файлов за один раз.

3
ответ дан 15.05.2020, 14:34

Можно использовать следующую команду:

Первый каталог изменения в терминале к каталогу, который содержит .zip файлы:

cd /path

Тогда выполняют эту команду для разархивации всех .zip файлов:

for z in *.zip; do unzip "$z"; done
12
ответ дан 15.05.2020, 14:34

Если у Вас есть многие .zip файлы в Вашей папке, и Вы хотите распаковать всех их, тогда открывают терминал и переходят к Вашему использованию папки:

cd <path_to_folder>

Теперь использование эта команда для распаковки весь Вашего .zip файл:

ls *.zip | xargs -n1 unzip
10
ответ дан 15.05.2020, 14:36
  • 1
    Это перестанет работать, если какие-либо из имен файлов будут содержать пробел. – The Original Android 15.05.2020, 14:36
  • 2
    It' s лучшая идея использовать echo *.zip вместо этого, чтобы препятствовать тому, чтобы возможное ls псевдоним кралось в дополнительной информации, однако который все еще не устраняет пробельную проблему. – Steven Elliott 15.05.2020, 14:36
  • 3
    @OleTange В случае, если Вы didn' t уведомление, я сказал, что оно все еще перестало работать на именах файлов с пробелом в них. – Rieekan 15.05.2020, 14:37
  • 4
    да, Вы корректны. – arslan haktic 15.05.2020, 14:37
  • 5
    Никогда не зависьте от вывода от ls для сценариев, поскольку его вывод не четко определен между версиями. Вместо этого посмотрите на ответ от @terdon, поскольку это решает все проблемы этого решения. – Remian8985 15.05.2020, 14:38

Теги

Похожие вопросы