Передати аргумент xargs як рядок до іншої команди з '>'?


9

Припустимо, у мене є маса файлів /tmp/.

я згоден

find . -type f | xargs -iFILES

І я хочу зробити md5sumв кожному файлі, виводячи у файл з тим самим іменем, але з .md5розширенням.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Це має створити файл md5 для кожного файлу, знайденого командою find. Натомість він створює єдиний файл FILES.md5 на диску з контрольними сумами з усіх файлів.

Як я можу сказати команді md5sum, що ФАЙЛИ представляють поточне ім'я файлу, а не буквальний рядок FILES?

Відповіді:


4

Вам потрібен якийсь спосіб сказати, що ви хочете надіслати вихід у md5sumфайл. Оскільки find(або xargs) не має вбудованої цієї функціональності та md5sumзнає лише, як друкувати на стандартний вихід, перенаправлення оболонки - це найпростіший спосіб.

Зверніть увагу, що ваша команда не працює в загальному випадку з іншої причини: формат виводу findне є вхідним форматом xargs, вони відрізняються іменами файлів, що містять пробіл або \"'. Використовуйте find -execзамість цього.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;

7

Для обробки перенаправлення вводу-виводу потрібно використовувати підзадільну оболонку:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'

5

З GNU Parallel ви можете:

find . -type f | parallel md5sum {} \> {}.md5

Ви отримуєте додаткову перевагу паралельного запуску md5sum та таких файлів, як:

My brother's 12" records.txt

не призведе до збоїв вашої команди. Перегляньте вступне відео, щоб дізнатися більше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.