Передать аргумент 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 представляют текущее имя файла, а не литеральную строку FILES?

Кто-то все еще использует тебя MS-DOS
источник

Ответы:

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'
jsbillings
источник
5

С GNU Parallel вы можете делать:

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

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

My brother's 12" records.txt

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

Оле Танге
источник