Ответы:
Если вы действительно хотите распаковать их параллельно, вы можете сделать
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 параллельно команда хорошо подходит для такого рода вещи. После:
$ sudo apt-get install parallel
затем
ls *.zip | parallel unzip
При этом будет использовано столько ядер, сколько у вас есть, и каждое ядро будет разархивировано, пока все они не будут готовы.
echo *.zipвместо этого, чтобы предотвратить возможное проникновение псевдонима ls в дополнительную информацию. Однако это та же проблема, что и в ответе @ Guru, это касается имен файлов, содержащих пробелы.
xargsGNU Parallel не разбивается на имена файлов, содержащие пробел / tab / quote. Только если имена файлов содержат символы новой строки, вам придется проявлять особую осторожность. Например, используя:parallel unzip ::: *.zip
echoтак же плохо, как использование ls. Globbing и цикл времени - самый безопасный.
Если .zipв вашей папке много файлов и вы хотите распаковать их все, откройте терминал и перейдите в вашу папку, используя:
cd <path_to_folder>
Теперь используйте эту команду, чтобы распаковать весь ваш .zipфайл:
ls *.zip | xargs -n1 unzip
echo *.zipВместо этого лучше использовать эту возможность, чтобы предотвратить возможное lsпроникновение псевдонима в дополнительную информацию, однако это по-прежнему не устраняет проблему пробелов.
lsдля скриптов for, так как их выходные данные не определены между версиями. Вместо этого посмотрите на ответ @terdon, поскольку он решает все проблемы этого решения.
Вы можете использовать найти -execкак так,
find . -name "*.zip" -exec unzip {} \;
Это будет работать, если в имени файла есть пробел.
unzip \*.zip или unzip '*.zip'
Очевидное unzip *.zipне работает, потому что оболочка расширяет его unzip foo.zip bar.zip ...и unzipинтерпретирует первое имя файла как zip-файл, а следующие имена файлов как файлы для извлечения из этого zip-файла.
Тем не менее, unzipэто немного необычно для команд Unix в том смысле, что он делает свои собственные расширения глобуса. Если *оболочка не раскрывается, unzip сделает это и интерпретирует все полученные имена файлов как zip-файлы для обработки. Так что в этом особом случае можно обойтись без forпетли xargsили чего-то подобного.