<Предыдущая | Содержание: | Следующая>
xargs
Ассоциация xargs Команда выполняет интересную функцию. Он принимает ввод от стандартного ввода и преобразует его в список аргументов для указанной команды. В нашем примере мы бы использовали это так:
find ~ -type f -name 'foo *' -print | xargs ls -l
find ~ -type f -name 'foo *' -print | xargs ls -l
-rwxr-xr-x 1 мне
-rw-r - r-- 1 меня
-rwxr-xr-x 1 мне
-rw-r - r-- 1 меня
мне 224 2007-10-29, 18:44 / home / me / bin / foo
мне 224 2007-10-29, 18:44 / home / me / bin / foo
me
me
0 2016 09:19 /home/me/foo.txt
0 2016 09:19 /home/me/foo.txt
Здесь мы видим результат найдите команда передана в xargs который, в свою очередь, составляет список аргументов для ls команда, а затем выполняет ее.
Примечание: Хотя количество аргументов, которые можно поместить в командную строку, довольно велико, оно не безгранично. Возможно создание слишком длинных команд для оболочки. Когда длина командной строки превышает максимальную длину, поддерживаемую системой, xargs выполняет указанную команду с максимально возможным числом аргументов, а затем повторяет этот процесс до тех пор, пока стандартный ввод не будет исчерпан. Чтобы увидеть максимальный размер командной строки, выполните xargs с
Параметр --show-limits.
Работа со смешными именами файлов
Unix-подобные системы допускают встраивание пробелов (и даже новых строк!) В имена файлов. Это вызывает проблемы для таких программ, как xargs которые создают списки аргументов для других программ. Вложенный пробел будет рассматриваться как разделитель, и результирующая команда будет интерпретировать каждое слово, разделенное пробелами, как отдельный аргумент. Чтобы преодолеть это, найдите и xargs разрешить необязательное использование нулевой символ как разделитель аргументов. Нулевой символ определяется в ASCII как символ, представленный числом ноль (в отличие, например, от символа пробела, который определен в ASCII как символ, представленный числом 32). В найдите команда обеспечивает действие -print0, который производит вывод, разделенный нулем, и xargs команда имеет --нулевой опция, которая принимает ввод, разделенный нулем. Вот пример:
найти ~ -iname '* .jpg' -print0 | xargs --null ls -l
Используя этот метод, мы можем гарантировать, что все файлы, даже те, которые содержат пробелы в своих именах, обрабатываются правильно.