Ответы:
Если вы действительно хотите распаковать их параллельно, вы можете сделать
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, это касается имен файлов, содержащих пробелы.
xargs
GNU 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
или чего-то подобного.