Прошлый пост в общих чертах рассказал нам об утилите xargs и ее возможностях. Сегодня уделим дополнительное внимание 2 ее флагам, которые вполне могут пригодиться.
1. И так, начнем с "-t". Флаг позволяет нам наглядно увидеть то, как xargs вызывает команду и какие аргументы ей передает.
Его полезно использовать для лучшего понимания принципа работы утилиты.
В следующем примере мы найдем все файлы с расширением .txt, разобьем список аргументов по разделителю "\0" и подсчитаем количество строк для каждого элемента:
$ find ./ -name \*.txt -print0 | xargs -0 -t wc -l
Сразу после выполнения нам выведется строка с общим видом выполняемой команды:
wc -l ./file1.txt ./file2.txt './test document.txt'
3 ./file1.txt
10 ./file2.txt
15 ./test document.txt
Можем убедиться в том, что "wc -l" выполнился 1 раз с вот таким длинным списком аргументов. Далее будем использовать "-t" для просмотра и разбора вызовов.
2. Переходим к "-L". Эта вещь позволяет нам указать, сколько строк будет передано на каждый вызов команды.
Тут уточню, что указывается количество строк, а не аргументов. В 1 строке может быть несколько разделённых параметров:
$ ls | paste - -
file1.sh file2sh
file3.sh file4.sh
Тогда все просто - xargs передаст команда столько аргументов, сколько найдет в каждой строке:
$ ls | paste - - | xargs -t -L1 wc -l
wc -l file1.sh file2.sh
...
wc -l file3.sh file4.sh
Полезный пример, матайте на ус. Используется, когда нужно, например, поменять расширение для нескольких файлов:
$ ls | sed -e "p;s/.txt$/.sh/" | xargs -L2 mv
Давайте разберем по частям:
$ ls | sed -e "p;s/.txt$/.sh/"
file1.txt
file1.sh
file2.txt
file2.sh
Вывод команды ls передается на вход для sed, после чего тот печатает изначальные строки и те, в которых изменено расширение.
В следующей части вывод sed передается команде xargs, которая выполняет mv по 1 разу для каждых 2 строк. Внедрим параметр "-t" для наглядности:
$ ... | xargs -L2 -t mv
mv file1.txt file1.sh
mv file2.txt file2.sh
Хммм, а если у нас есть файлы, имена которых состоят из нескольких слов, разделенных пробелами... Решается по щелчку:
$ ls | sed -e "p;s/.txt$/.sh/" | tr "\n" "\0" | xargs -L2 -t -0 mv
Команда 'tr "\n" "\0"' заменяет символы, а флаг "-0" теперь воспринимает за разделитель только символ "\0".
LinuxCamp
