Відповіді:
Якщо ви дійсно хочете паралельно розтискати їх, ви можете зробити це
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
замість цього, щоб запобігти проникненню додаткової інформації. Однак це питання є тим же, що і у відповіді @ Гуру, воно порушує імена файлів, що містять пробіли.
xargs
GNU Паралель не розбивається на імена файлів, що містять пробіл / вкладку / цитату. Тільки якщо назви файлів містять нові рядки, вам доведеться бути обережними. Наприклад, використовуючи: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
тощо.