Відповіді:
Якщо ви дійсно хочете паралельно розтискати їх, ви можете зробити це
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замість цього, щоб запобігти проникненню додаткової інформації. Однак це питання є тим же, що і у відповіді @ Гуру, воно порушує імена файлів, що містять пробіли.
xargsGNU Паралель не розбивається на імена файлів, що містять пробіл / вкладку / цитату. Тільки якщо назви файлів містять нові рядки, вам доведеться бути обережними. Наприклад, використовуючи:parallel unzip ::: *.zip
echoсамо погано, як і використовувати ls. Глобінг і цикл на час є найбезпечнішим.
Якщо .zipу вашій папці багато файлів, і ви хочете розпакувати їх, відкрийте термінал і перейдіть до своєї папки за допомогою:
cd <path_to_folder>
Тепер використовуйте цю команду, щоб розпакувати весь .zipфайл:
ls *.zip | xargs -n1 unzip
echo *.zipзамість цього, щоб запобігти lsпроникненню додаткової інформації про псевдонім, але це все ще не вирішує проблему з пробілами.
lsсценаріїв, оскільки його вихід недостатньо визначений між версіями. Замість цього подивіться на відповідь від @terdon, оскільки вона вирішує всі проблеми цього рішення.
Ви можете використовувати Find з -execподібним чином,
find . -name "*.zip" -exec unzip {} \;
Це буде працювати , якщо файл має місце в назві.
unzip \*.zip або unzip '*.zip'
Очевидне unzip *.zipне працює, тому що оболонка розширює його unzip foo.zip bar.zip ...і unzipінтерпретує перше ім'я файлу як zip-файл, а наступні імена файлів як файли, які слід витягнути з цього поштового файлу.
Однак unzipсеред команд Unix трохи незвично тим, що він робить власні глобальні розширення. Якщо *оболонка не розгорнута, unzip зробить це, а всі отримані імена файлів буде сприйнято як поштові файли для обробки. Тож у цьому спеціальному випадку можна піти без forпетлі xargsтощо.