У меня есть более 200 .zip
файлов в одной папке. Я не хочу распаковывать их по одному. Я хочу извлечь те, которые используют одну команду или скрипт. Как это сделать.
27
Если вы действительно хотите распаковать их параллельно, вы можете сделать
for i in *zip; do unzip "$i" & done
Это, однако, запустит N процессов для N .zip файлов и может быть очень тяжелым в вашей системе. Для более контролируемого подхода, запускающего только 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
-exec
или-execdir
вместо того, чтобы обвязатьxargs
. Это не только проще для понимания, но и менее подвержено ошибкам и использует меньше системных ресурсов.find . -name '*.zip' -exec unzip {} ';'
(Вы должны цитировать точку с запятой.)-exec \;
(вы можете избежать точки с запятой, без кавычек), будет запускать каждую команду последовательно.-exec +
лучше, но это не сработает, потому что это не такunzip
.GNU параллельно команда хорошо подходит для такого рода вещи. После:
затем
При этом будет использовано столько ядер, сколько у вас есть, и каждое ядро будет разархивировано, пока все они не будут готовы.
источник
echo *.zip
вместо этого, чтобы предотвратить возможное проникновение псевдонима ls в дополнительную информацию. Однако это та же проблема, что и в ответе @ Guru, это касается имен файлов, содержащих пробелы.xargs
GNU Parallel не разбивается на имена файлов, содержащие пробел / tab / quote. Только если имена файлов содержат символы новой строки, вам придется проявлять особую осторожность. Например, используя:parallel unzip ::: *.zip
echo
так же плохо, как использованиеls
. Globbing и цикл времени - самый безопасный.Вы можете использовать следующую команду:
Сначала измените каталог в терминале на каталог, содержащий файлы .zip:
Затем выполните эту команду, чтобы разархивировать все файлы .zip:
источник
Если
.zip
в вашей папке много файлов и вы хотите распаковать их все, откройте терминал и перейдите в вашу папку, используя:Теперь используйте эту команду, чтобы распаковать весь ваш
.zip
файл:источник
echo *.zip
Вместо этого лучше использовать эту возможность, чтобы предотвратить возможноеls
проникновение псевдонима в дополнительную информацию, однако это по-прежнему не устраняет проблему пробелов.ls
для скриптов for, так как их выходные данные не определены между версиями. Вместо этого посмотрите на ответ @terdon, поскольку он решает все проблемы этого решения.Вы можете использовать найти
-exec
как так,Это будет работать, если в имени файла есть пробел.
источник
Нетерминальный метод.
Просто выберите zip-файлы, щелкните правой кнопкой мыши и выберите
extract here
. Вы можете выбрать все или только несколько zip-файлов одновременно.источник
unzip \*.zip
илиunzip '*.zip'
Очевидное
unzip *.zip
не работает, потому что оболочка расширяет егоunzip foo.zip bar.zip ...
иunzip
интерпретирует первое имя файла как zip-файл, а следующие имена файлов как файлы для извлечения из этого zip-файла.Тем не менее,
unzip
это немного необычно для команд Unix в том смысле, что он делает свои собственные расширения глобуса. Если*
оболочка не раскрывается, unzip сделает это и интерпретирует все полученные имена файлов как zip-файлы для обработки. Так что в этом особом случае можно обойтись безfor
петлиxargs
или чего-то подобного.источник