Введение в команду xargs с практическими примерами

xargs - это команда Unix, используемая для создания и выполнения команд из стандартного ввода. Вы можете комбинировать его с другими мощными командами Unix, такими как grep, awk и т. Д., Используя каналы. Проще говоря, он передает вывод одной команды как ввод другой.

Он работает в большинстве Unix-подобных операционных систем. Но имейте в виду, что эта команда работает немного по-разному в macOS и Linux. Примеры в этом руководстве были подготовлены и протестированы в дистрибутиве Ubuntu.

В этой статье вы узнаете о практических примерах xargs на простых примерах.

Давайте начнем!

Обычное использование

Во-первых, давайте посмотрим, как команда xargs работает сама по себе.

Если вы попытаетесь запустить его без аргументов, по умолчанию он выполнит команду echo. Чтобы получить результат, просто введите что-нибудь и нажмите Ctrl + D на клавиатуре:

$ xargs
hello

Результат:

hello

Обрабатывать несколько файлов одновременно

Обычно xargs используется в сочетании с другими командами. Чтобы разобраться в типичных случаях использования, мне понадобятся несколько тестовых файлов. Давайте сразу создадим наши фиктивные данные с помощью команды xargs.

Чтобы создать сразу несколько файлов, объедините xargs с командой touch:

$ echo test1.log test2.log test3.log 1.txt 2.csv | xargs touch
$ ls
1.txt  2.csv test1.log  test2.log  test3.log

Обратите внимание, что выходные данные команды echo были переданы как входные данные touch command.

Находите файлы и выполняйте различные операции

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

Предположим, вы хотите найти и удалить все файлы журналов, содержащие test в своих именах. Давайте поиграем с нашими фиктивными данными:

$ find . -type f -name "*test*.log" | xargs ls
./test1.log  ./test2.log  ./test3.log
$ find . -type f -name "*test*.log" | xargs rm -f
$ ls
1.txt  2.csv  3.test

Как видите, сначала я выполнил команду ls, чтобы проверить, какие имена файлов я получаю. Затем я выполнил команду rm -f, чтобы удалить эти файлы.

Однако имейте в виду, что имена некоторых файлов могут содержать пробелы. Рассмотрим следующее имя файла: something with white space.log.

Попробуем удалить файл предыдущей командой:

$ ls
1.txt   2.csv   3.test  'something with white space.log'
$ find . -type f -name "*.log" | xargs rm -f
$ ls
1.txt   2.csv   3.test  'something with white space.log'

К сожалению, ожидаемого результата мы не получили. Итак, как нам бороться с пробелами? Используйте параметр find -print0 и параметр xargs -0:

$ find . -type f -name "*.log" -print0 | xargs -0 rm -rf
$ ls
1.txt  2.csv  3.test

Таким образом, -print0 разделяет имена файлов знаком null , чтобы имена, содержащие пробелы или символы новой строки, могли правильно интерпретироваться xargs.

Объедините его с командой grep, чтобы найти шаблоны в нескольких файлах

Другое типичное использование xargs - с командой grep. Например, давайте попробуем найти строку hello путем сканирования нескольких файлов:

$ find . -type f | xargs grep 'hello'
./1.txt:hello there
./3.test:hello here

Прочитать ввод из файлов аргументов

До сих пор мы видели, что команда xargs принимает ввод из стандартного ввода. Он также может читать элементы из файла. Для этого добавьте параметр -a, который означает — arg-file .

Я создал входной файл с именем files.txt:

$ cat files.txt 
3.test
1.txt
$ xargs -a files.txt ls -lart
-rw-rw-r-- 1 kirshi kirshi 12 apr    2 21:27 1.txt
-rw-rw-r-- 1 kirshi kirshi 19 apr    2 21:27 3.test

Мы только что выполнили команду ls -lart для всех файлов, перечисленных в файле аргументов.

Запрашивать у пользователя подтверждение

Иногда, когда мы выполняем деструктивные операции, такие как rm -f, мы можем попросить пользователя подтвердить. Опция -p может сделать это за нас. Это означает — interactive и предлагает пользователю подтвердить да / нет.

Давайте посмотрим на этот пример:

$ xargs -p -a files.txt rm -f
rm -f 3.test 1.txt ?...y
$ ls
2.csv  files.txt

Очень удобно, что он показывает, какая операция будет выполняться. Как видите, файлы были удалены, потому что я набрал y вместо «Да», когда программа спросила.

Выполнять команды построчно

Вышеупомянутая операция удалила все файлы. Что, если бы мы захотели проверить и подтвердить их одну за другой? Вот как вступает в игру опция -n (— max-args).

Для этого требуется ряд аргументов, которые вы хотите xargs передавать в командной строке.

Давайте снова запустим команду удаления - на этот раз с -n 1:

$ xargs -p -n1 -a files.txt rm -f
rm -f 3.test ?...y
rm -f 1.txt ?...n
$ ls
1.txt  2.csv  files.txt

Файл 1.txt был сохранен, потому что я набрал n в терминале.

Резюме

Мы видели, как использовать команду xargs в сочетании с другими командами для выполнения таких операций, как:

  • Создание / управление несколькими файлами одновременно
  • Поиск файлов по шаблону и выполнение операций с каждым файлом
  • Чтение ввода из файлов аргументов
  • Запрос пользователя на подтверждение перед выполнением команды

Это одни из наиболее часто используемых случаев, но с помощью этой команды вы можете сделать даже больше. Чтобы изучить другие возможности, перейдите в документацию.

Если у вас есть любимые xargs команды, не стесняйтесь делиться ими в комментариях.

Если вам понравилась эта статья, возможно, вам понравятся мои статьи о других советах по Unix:







Спасибо, что прочитали, и увидимся в следующий раз!