У мене папка, яка містить приблизно 320116 файли .pdb.gz. Хочеться розпакувати їх усіх. Якщо я використовую gunzip * .gz, це дає мені помилку, тобто список аргументів занадто довгий. Папка близько 2 Гб. Будь ласка, дайте мені відповідну пропозицію.
У мене папка, яка містить приблизно 320116 файли .pdb.gz. Хочеться розпакувати їх усіх. Якщо я використовую gunzip * .gz, це дає мені помилку, тобто список аргументів занадто довгий. Папка близько 2 Гб. Будь ласка, дайте мені відповідну пропозицію.
Відповіді:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +надасть gunzipбагато, але не занадто багато імен файлів у своєму командному рядку. Це більш ефективно, ніж -exec gunzip {} \;це запускає новий gunzipпроцес для кожного файлу.
find, менше gunzip!
findдозволяють позначити "+". Дивіться, наприклад, на findсторінці керівництва BSD 10.1 . Також стосується OS X (10.9 і принаймні пізніше, можливо, і раніше).
Щоразу, коли ви отримуєте помилки "списку аргументів", ви можете обійти його, викликаючи потрібну команду кілька разів, кожен раз із підмножиною аргументів, які ви хочете використовувати. xargsце інструмент, який допоможе вам зробити це автоматично.
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;тобто xargs буде викликати gunzip окремо для кожного файлу? Це моє читання сторінки людини.
xargsбуде заповнено стільки імен файлів, скільки вміститься в gunzipкомандному рядку. Спробуй це! echo a b c d e f | xargs echoлише echoодин раз викликає всі 6 аргументів, тож ви бачите один рядок виводу (хоч і непотрібна команда для виконання !!!!), хоча якщо ви змушуєте xargsподавати до 3 аргументів за виклик команди, використовуючи, echo a b c d e f | xargs -n 3 echoтоді ви отримуєте 2 рядки виводу .
xargsполягає в тому, що за допомогою цього -Pпараметра ви можете запускати кілька gunzipпроцесів паралельно, які (залежно від точних параметрів вашої системи) можуть йти швидше.
-P, @psmears. Тепер я теж щось навчився!
Я думаю, що це має спрацювати, воно передає шлях / ім’я кожного файлу окремо до gunzip для обробки:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
findз +та xargsє чітко дизайнером, маючи на увазі саме це питання. Вони завжди будуть надавати стільки аргументів, скільки можуть, при цьому не перевищуючи ліміт операційної системи. Тому що, до речі, він є ценз роботи системи, нічого спільного з gunzip.
Спробуйте таким чином:
find . -name '*.gz' -exec gunzip {} \;
Якщо у вас багатоядерна машина, ви, ймовірно, побачите, що використання gunzipне збільшить можливості вашої машини. Для цього вам потрібно запустити кілька gunzips паралельно. Щоб відстежувати, що робиться, в якому терміналі вручну є громіздким, але ви можете легко зробити це за допомогою паралелі GNU:
find . -name "*.gz" | parallel -X gunzip {}
parallelзанадто довгий?
findзанадто довгий?
findкомандному рядку.
-name
Для цього зайве використовувати find, оскільки ви не згадали про підпапки. Що вам потрібно зробити:
for f in *.gz;do gunzip $f;done
findякщо ви не хочете нерестувати 320116 gunzipпроцеси, як це робить цикл.