Библиотека сайта rus-linux.net
Как использовать команду xargs в Linux
Оригинал: How to use xargs command in LinuxАвтор: Joshua Reed
Дата публикации: 25 сентября 2014 года
Перевод: А. Кривошей
Дата перевода: апрель 2015 г.
Попадали ли вы когда-нибудь в ситуацию, когда вам нужно запускать одну и ту же команду много раз подряд? Если да, то вы понимаете, насколько это скучно и неэффективно. А хорошая новость в том, что в операционных системах на базе Unix есть замечательная команда xargs, которая позволяет решить эту проблему.С помощью этой команды вы можете очень эффективно работать с большим количеством файлом, экономя свое время и нервы. В этой статье вы увидите, как это делается.
У команды xargs есть два компонента. Во-первых, вы должны указать файлы, которые вас интересуют. Во-вторых, вы должны задать команду или скрипт, который вы хотите применить к каждому из этих файлов.
В этом руководстве мы рассмотрим три сценария использования команды xargs для обработки файлов, расположенных в нескольких разных директориях:
1. Подсчет количества строк во всех файлах.
2. Вывод первой строки заданных файлов.
3. Обработка каждого файла с помощью заданного скрипта.
Рассмотрим директорию с именем xargstest (дерево директорий можно вывести с помощью команды tree с опциями -i и -f, которые позволяют вывести результаты без отступов и с полным префиксом пути для каждого файла):
$ tree -if xargstest/
Содержимое каждого из шести файлов:
Директория xargstest, ее поддиректории и файлы будут далее использоваться в наших примерах.
Сценарий 1: подсчет количества строк во всех файлах
Как говорилось ранее, первым компонентом команды xargs является список файлов, с которыми работает команда. Для того, чтобы индентифицировать эти файлы и вывести их спиоск, можно воспользоваться командой find. Опция -name 'file??' показывает, что нас интересуют только файлы, чье название начинается с "file", после чего в названии есть еще два любых любых символа. Поиск производится в директории xargstest, причем поиск осуществляется рекурсивно, то есть и во всех поддиректориях xargstest (если они имеются).
$ find xargstest/ -name 'file??' xargstest/dir3/file3B xargstest/dir3/file3A xargstest/dir1/file1A xargstest/dir1/file1B xargstest/dir2/file2B xargstest/dir2/file2A
Мы можем перенаправить результаты поиска в команду sort, чтобы упорядочить их по имени:
$ find xargstest/ -name 'file??' | sort xargstest/dir1/file1A xargstest/dir1/file1B xargstest/dir2/file2A xargstest/dir2/file2B xargstest/dir3/file3A xargstest/dir3/file3B
Теперь нам нужен второй компонент, представляющий собой команду, которую мы хотим выполнить. Для подсчета количества строк в каждом файле мы будем использовать команду wc с опцией -l (количество строк отображается в начале каждой строки вывода):
$ find xargstest/ -name 'file??' | sort | xargs wc -l 1 xargstest/dir1/file1A 2 xargstest/dir1/file1B 3 xargstest/dir2/file2A 4 xargstest/dir2/file2B 5 xargstest/dir3/file3A 6 xargstest/dir3/file3B 21 total
Вы видите, что вместо того, чтобы вручную запускать команду wc -l для каждого из этих файлов, xargs позволяет выполнить эту операцию одной командой. Вы можете легко осуществлять различные операции с сотнями файлов.
Сценарий 2: вывод первой строки каждого из заданных файлов
Теперь, когда вы в общем понимаете, как использовать команду xargs, вы имеете полную свободу в выборе команды для выполнения. Иногда вам может понадобиться обработать только некоторую выборку файлов, но не все, расположенные в данной директории. В таком случае необходимо воспользоваться командой find с опцией -name для того, чтобы выбрать требуемые файлы и перенаправить их в команду xargs. Например, если вам нужно вывести первую строку всех файлов, имена которых заканчиваются на "B", используется следующая комбинация команд find, xargs и head (head -n1 выводит первую строку файла):
$ find xargstest/ -name 'file?B' | sort | xargs head -n1 ==> xargstest/dir1/file1B <== one ==> xargstest/dir2/file2B <== one ==> xargstest/dir3/file3B <== one
Вы видите, что обрабатываются только файлы, чье имя заканчивается на "B", остальные игнорируются.
Сценарий 3: Обработка каждого файла с помощью скрипта
Наконец, у вас может быть свой скрипт (написанный на Bash, Python, или, например, на Perl) для обработки файлов. Просто подставьте его имя вместо команд wc и head в предыдущем примере.
$ find xargstest/ -name 'file??' | xargs myscript.sh
Необходимо, чтобы скрипт myscript.sh был написан таким образом, чтобы он принимал имя файла в качестве аргумента и обрабатывал этот файл. Приведенная выше команда будет применять этот скрипт к каждому файлу, найденному командой find.
Обратите внимание, что в вышеприведенных примерах имена файлов не содержат пробелов. В целом можно сказать, что жизнь в Linux значительно приятнее в том случае, если вы не используете пробелы в именах файлов. Если же вам необходимо обработать файлы, чьи названия включают пробелы, приведенная выше команда не будет работать. Ее необходимо немного модифицировать, добавив опцию "-print0" к команде find (которая выводит полное имя с символом "null" после него в stdout) и опцию "-0" к команде xargs (которая интерпретирует символ "null" в конце строки), как показано ниже:
$ find xargstest/ -name 'file*' -print0 | xargs -0 myscript.sh
Обратите внимание, что аргумент для опции -name изменился на 'file*', что подразумевает любые файлы с именами, начинающимися с "file" и заканчивающимися любыми символами.
Заключение
После прочтения этого руководства вы будете знать возможности команды xargs и как вы можете использовать их в своей работе. Скоро вы будете тратить гораздо меньше времени на выполнение повторяющихся задач. Если вы хотите узнать обо всех опциях и возможностях команды xargs, просто наберите в терминале:
$ man xargs