Что такое использование -exec xargs и -print0?

20

Я думаю, что это распространенные способы передачи результата одной команды следующей в качестве входных данных.

Как работают эти три? Или какие веб-сайты / URL-адреса?

Джеймс Бонд
источник

Ответы:

25

Первые вещи, чтобы напечатать:

man find

man xargs

По findумолчанию команда выводит результаты в стандартный вывод, поэтому -printопция обычно не требуется, но -print0разделяет имена файлов байтом 0 (NULL), чтобы имена, содержащие пробелы или переводы строк, можно было правильно интерпретировать.

Этот -execпараметр можно использовать вместо xargs - команда find выполняет команду для каждого найденного элемента.

Команда xargsчитает строки, разделенные пробелом или новой строкой (обычно из команды find , но они могут быть откуда угодно), и выполняет некоторые команды для каждой строки.
Если xargs запускается с опцией -0 , он будет ожидать строки, разделенные NULL, как выводfind ... -print0

Преимущество xargs в том, что он может группировать строки, так что он выполняет команду только один или два раза вместо n раз.

Итак, при обычном использовании:

find start_directory -name '*.txt' | xargs ls -l 

find выдаст список имен файлов, а xargs выдаст такие команды:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

что быстрее, чем выдача команды поиска:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
NJD
источник
7

Обратите внимание, что xargs больше не нужен для текущих реализаций поиска, которые, вероятно, все поддерживают этот синтаксис POSIX:

find directory -name '*.txt' -exec ls -l {} + 

что проще и немного быстрее, чем вариант xargs.

find directory -name '*.txt' | xargs ls -l 
jlliagre
источник
xargs использует гораздо меньше ресурсов, чем 'find -exec'
Фелипе Альварес
7
Это наоборот. Для передачи в xargs потребуется немного больше ресурсов, чем -exec. Вы, вероятно, пропускаете терминатор "+".
2010 года
2

Смотрите следующие статьи:

Linux и Unix найти руководство по командам с примерами
xargs: как управлять и использовать аргументы командной строки

harrymc
источник
по крайней мере одна из этих ссылок мертва. Лучше просто опубликовать соответствующий пример кода.
user5359531
@ user5359531: битая ссылка была заменена. И я не могу воспроизвести такие объемные учебники.
harrymc