Объяснение xargs команды Linux

Обновлено: 21.11.2024

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

Опубликовано 08 октября 2020 г.

Команда xargs используется в оболочке UNIX для преобразования ввода из стандартного ввода в аргументы команды.

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

Вот синтаксис, который вы будете использовать:

Мы используем канал ( | ) для передачи вывода в xargs . Это позаботится о запуске команды command2, используя вывод command1 в качестве аргумента(ов).

Давайте рассмотрим простой пример. Вы хотите удалить некоторые определенные файлы из каталога. Эти файлы перечислены внутри текстового файла.

У нас есть 3 файла: файл1, файл2, файл3.

В todelete.txt у нас есть список файлов, которые мы хотим удалить, в этом примере файл1 и файл3:

Мы направим выходные данные cat todelete.txt команде rm через xargs .

Вот и результат, перечисленные нами файлы теперь удалены:

Это работает следующим образом: xargs запускает rm 2 раза, по одному разу для каждой строки, возвращаемой cat .

Это самое простое использование xargs . Мы можем использовать несколько вариантов.

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

Опция -n позволяет указать xargs выполнять одну итерацию за раз, поэтому вы можете индивидуально подтверждать их с помощью -p . Здесь мы говорим xargs выполнять одну итерацию за раз с помощью -n1 :

Другой широко используемый параметр -I. Это позволяет вам поместить результат в заполнитель, а затем вы можете делать разные вещи.

Одним из них является запуск нескольких команд:

Вы можете заменить символ %, который я использовал выше, на любой другой, это переменная

Команда xargs работает в Linux, macOS, WSL и везде, где есть среда UNIX

Хотите стать лучшим веб-разработчиком? Присоединяйтесь к учебному лагерю веб-разработки 2022!

Учебник по использованию xargs, команды UNIX и Linux для создания и выполнения командных строк из стандартного ввода. Примеры обрезки по символу, позиции байта, обрезки на основе разделителя и способов изменения выходного разделителя.

Приблизительное время чтения: 3 минуты

Оглавление

Что такое команда xargs в UNIX?

Команда xargs в UNIX — это утилита командной строки для построения конвейера выполнения из стандартного ввода. В то время как такие инструменты, как grep, могут принимать стандартный ввод в качестве параметра, многие другие инструменты не могут. Использование xargs позволяет таким инструментам, как echo, rm и mkdir, принимать стандартный ввод в качестве аргументов.

Как использовать xargs

По умолчанию xargs считывает элементы из стандартного ввода, разделенные пробелами, и выполняет команду один раз для каждого аргумента. В следующем примере стандартный ввод передается в xargs, и команда mkdir запускается для каждого аргумента, создавая три папки.

Если имена файлов содержат пробелы, необходимо использовать параметр -d для изменения разделителя

ls ‘one two three.txt’ ‘four.txt’ find . -имя ‘*.txt’ | xargs -d ‘\n’ rm

Как использовать xargs с поиском

Самое распространенное использование xargs — это использование его с командой find. Это использует find для поиска файлов или каталогов, а затем использует xargs для обработки результатов. Типичными примерами этого являются смена владельца файлов или перемещение файлов.

find и xargs можно использовать вместе для работы с файлами, которые соответствуют определенным атрибутам. В следующем примере файлы старше двух недель находятся во временной папке и затем передаются команде xargs, которая запускает команду rm для каждого файла и удаляет их.

xargs v exec

Команда find поддерживает параметр -exec, позволяющий выполнять произвольные команды над найденными файлами. Следующие эквивалентны.

Так какой из них быстрее? Давайте сравним папку с 1000 файлами в ней.

Очевидно, что использование xargs намного эффективнее. На самом деле несколько тестов показывают, что использование xargs вместо exec <> в шесть раз эффективнее.

Как распечатать выполняемые команды

Опция -t выводит на терминал каждую команду, которая будет выполняться. Это может быть полезно при отладке скриптов.

Как просмотреть команду и запрос на выполнение

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

Как запустить несколько команд с помощью xargs

Можно запускать несколько команд с аргументами xargs, используя флаг -I. Это заменяет вхождения аргумента аргументом, переданным в xargs. Следующее повторяет строку и создает папку.

Дополнительная литература

У вас есть новости или предложения по этой статье? Вы можете отредактировать его здесь и отправить мне запрос на вытягивание.

Последние публикации

Об авторе

Джордж Орнбо живет в Великобритании.

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

xargs — одна из самых мощных команд в Linux. В этом руководстве вы научитесь использовать команду xargs с некоторыми практическими и полезными примерами.

xargs — одна из самых мощных команд в Linux. В этом руководстве я покажу вам, как с помощью xargs преобразовать стандартный ввод в команды.

Что такое команда xargs?

Команда xargs считывает строки текста из стандартного ввода или вывода другой команды, превращает их в команды и выполняет их.

Команду xargs часто используют вместе с командой find. Команда find дает вам список имен файлов, а команда xargs позволяет использовать эти имена файлов одно за другим, как если бы они были введены другой командой.

Поскольку xargs работает с перенаправлением, я настоятельно рекомендую освежить свои знания о перенаправлении stdin, stdout и pipe в Linux.

Как использовать команду xargs?

Команда xargs имеет следующий синтаксис:

Но вы, вероятно, не собираетесь использовать его таким образом. Его сила заключается в объединении вывода одной команды с другой. Давайте рассмотрим это на простом примере.

В моем текущем каталоге есть несколько текстовых файлов, и в файле flowers.txt есть имена всех этих файлов:

Теперь моя цель состоит в том, чтобы увидеть размер всех файлов, упомянутых в flowers.txt. Здравый смысл подсказывает, что я мог бы объединить команду cat для отображения всех имен файлов, а затем передать ее команде du для проверки размера файла.

Но если я передам его напрямую, он не даст размер каждого из файлов, упомянутых в файле flowers.txt.

Почему? Во-первых, команда du не принимает стандартный ввод. Во-вторых, вывод команды cat — это не отдельные имена файлов. Это похоже на слова, разделенные символом новой строки.

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

Думайте об этом как о передаче этих имен файлов команде du:

Теперь вы понимаете силу команды xargs, не так ли?

xargs и find: созданы друг для друга

Вы часто обнаружите, что она используется в сочетании с "командой поиска". Команда find ищет файлы и каталоги и возвращает их имена. Благодаря xargs вы можете использовать результат команды find для определенных целей, таких как переименование, перемещение, удаление и многое другое.

Допустим, вы хотите получить все файлы, оканчивающиеся на .txt и содержащие слово red. Вы можете комбинировать команды find и grep с помощью xargs:

Работа с именами файлов с пробелами

Если у вас есть файл с пробелом в имени, это вызовет проблемы. Допустим, я переименовал three_lotus.txt в «three lotus.txt». Теперь при обработке через xargs он виден как два отдельных файла как три и lotus.txt.

В таких случаях следует использовать параметр -print0 команды find. Он разделяет строки нулевыми символами ASCII вместо символов новой строки. Точно так же вы также должны использовать xargs с -0, чтобы принять пустые значения ASCII.

Посмотреть, какая команда выполняется

Если вы хотите увидеть, какая команда выполняется с помощью xargs, вы можете использовать параметр -t. Он напечатает фактическую выполняемую команду.

Заставить xargs запрашивать подтверждение перед запуском команды

В некоторых ситуациях требуется особая осторожность, например при удалении файлов. Было бы неплохо увидеть, какая команда будет выполнена, и иметь возможность отклонить выполнение.

Для получения подсказки можно использовать параметр -p команды xargs.

Использование заполнителя с xargs для большего контроля над ним

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

Например, если вы используете команду перемещения, вам сначала нужен источник, а затем цель. Если вы хотите переместить найденные файлы в целевой каталог, эта команда не будет работать:

Здесь вы можете использовать заполнители в xargs с опцией -мне нравится это:

Представьте, что xargs получает все имена файлов из команды find и сохраняет их в <>. Затем он переходит к команде mv и предоставляет содержимое <>.

Основное отличие состоит в том, что вместо того, чтобы помещать все имена файлов в одну команду, они добавляются по одному. Вот почему для каждого аргумента вызывается команда mv (как вы можете видеть в приведенном выше примере).

Примечание. Я использовал <> в качестве заполнителя. Вы можете использовать большинство других букв или символов в качестве заполнителя. <> является безопасным выбором, его легко понять и отличить.

Выполнение нескольких команд с помощью xargs

Вы можете использовать заполнители для запуска нескольких команд с помощью xargs.

Имейте в виду, что заполнитель не распространяется на следующее перенаправление канала или другую команду. Вот почему я использовал здесь команду sh.

Всегда есть что-то еще…

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

Как и у большинства других команд Linux, у xargs есть еще множество опций. Вы всегда можете обратиться к справочной странице команды xargs для получения дополнительной информации.

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

Если у вас есть какие-либо вопросы или предложения, дайте мне знать в разделе комментариев.

Дэйв Маккей

Дэйв Маккей
Писатель

Фатмавати Ахмад Заэнури/Shutterstock

Нужно связать вместе несколько команд Linux, но одна из них не принимает ввод по конвейеру? xargs может взять выходные данные одной команды и отправить их другой команде в качестве параметров.

Все стандартные утилиты Linux имеют три связанных с ними потока данных. Это стандартный поток ввода (stdin), стандартный поток вывода (stdout) и стандартный поток ошибок (stderr).

Эти потоки работают с текстом. Мы отправляем ввод (stdin) в команду с помощью текста, а ответ (stdout) записывается в окно терминала в виде текста. Сообщения об ошибках также записываются в окно терминала в виде текста (stderr).

Одной из замечательных особенностей Linux и Unix-подобных операционных систем является возможность направлять вывод stdout одной команды во ввод stdin второй команды. Первую команду не волнует, что ее вывод не идет в окно терминала, а второй команде все равно, что ее ввод не идет с клавиатуры.

Хотя все команды Linux имеют три стандартных потока, не все из них принимают стандартный вывод другой команды в качестве входных данных для своего стандартного ввода. Это означает, что вы не можете передать им входные данные.

xargs — это команда для построения конвейеров выполнения с использованием стандартных потоков данных. С помощью xargs мы можем заставить такие команды, как echo , rm и mkdir принимать стандартный ввод в качестве аргументов.

Команда xargs

xargs будет принимать входные данные по конвейеру. Он также может принимать ввод из файла. xargs использует этот ввод в качестве параметров для команд, с которыми мы сказали ему работать. Если мы не укажем xargs работать с определенной командой, по умолчанию будет использоваться echo .

Мы можем использовать это, чтобы продемонстрировать, как xargs всегда будет генерировать одну строку вывода, даже при многострочном вводе.

Если мы используем параметр -1 (указать один файл в строке) с ls , мы получим один столбец имен файлов.

Это список файлов сценария оболочки в текущем каталоге.

Мы получили один столбец, как и ожидалось. Если мы пропустим его через xargs, что мы получим?

Вывод записывается в окно терминала в виде одного длинного потока текста.

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

Использование xargs с wc

Мы можем использовать xargs, чтобы wc легко подсчитывал слова, символы и строки в нескольких файлах.

Вот что происходит:

  • ls выводит список файлов *.page и передает список xargs .
  • xargs передает имена файлов в wc .
  • wc обрабатывает имена файлов так, как если бы они были получены в качестве параметров командной строки.

Статистика для каждого файла отображается вместе с общим итогом.

Использование xargs с подтверждением

Мы можем использовать параметр -p (интерактивный), чтобы xargs запрашивал у нас подтверждение того, что мы согласны на продолжение.

Если мы передадим в touch строку имен файлов через xargs, touch создаст файлы для нас.

Отображается команда, которая будет выполнена, и xargs ждет, пока мы ответим, введя «y» или «Y», или «n» или «N», и нажав Enter.

Если вы просто нажмете Enter, это будет обработано как «n». Команда выполняется, только если вы введете «y» или «Y».

Мы нажали «y» и нажали Enter. Мы можем использовать ls для проверки того, что файлы были созданы.

Использование xargs с несколькими командами

Мы можем использовать несколько команд с xargs, используя параметр -I (начальные аргументы).

Этот параметр определяет «строку замены». Везде, где в командной строке появляется токен для строки замены, вставляются значения, которые были предоставлены для xargs.

Давайте воспользуемся командой дерева для просмотра подкаталогов из текущего каталога. Параметр -d (каталог) заставляет дерево игнорировать файлы и сообщать только о каталогах.

Существует один подкаталог с именем «images».

В файле с именем «directories.txt» у нас есть имена некоторых каталогов, которые мы хотим создать. Мы можем посмотреть его содержимое с помощью cat .

Мы собираемся использовать это как входные данные для xargs. Команда, которую мы собираемся выполнить, такова:

Это выглядит следующим образом:

  • cat directory.txt |: содержимое файла directorys.txt (все новые имена каталогов) помещается в xargs .
  • xargs -I %: определяет «заменить строку» токеном «%».
  • sh -c: запускает новую подоболочку. Параметр -c (команда) указывает оболочке читать команды из командной строки.
  • ‘эхо %; mkdir %’: каждый из токенов «%» будет заменен именами каталогов, переданными xargs. Команда echo напечатает имя каталога; команда mkdir создаст каталог.

Каталоги перечислены один за другим.

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

Копирование файлов в несколько мест

Мы можем использовать xargs, чтобы позволить нам копировать файлы в несколько мест с помощью одной команды.

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

В данном случае это команда cp . Таким образом, эффект заключается в вызове cp дважды, каждый раз с одним из двух каталогов в качестве параметра командной строки. Параметр xargs, позволяющий это сделать, называется опцией -n (максимальное число). Мы собираемся установить это значение равным единице.

Мы также используем параметр -v (подробный) с cp, чтобы он сообщал о том, что происходит.

Файлы копируются в два каталога, по одному за раз. cp сообщает о каждом действии копирования файла, чтобы мы могли видеть их выполнение.

Удаление файлов во вложенных каталогах

Если в именах файлов есть пробелы и странные символы, например символы новой строки, xargs не сможет их правильно интерпретировать. Мы можем решить эту проблему, используя опцию -0 (нулевой терминатор). Это говорит xargs использовать нулевой символ в качестве последнего разделителя для имен файлов.

В этом примере мы будем использовать find. find имеет собственную опцию для работы с пробелами и странными символами в именах файлов.Это опция -print0 (полное имя, нулевой символ).

Это выглядит следующим образом:

  • найти . -name «*.jpg»: find будет искать в текущем каталоге «.» для объектов с именами, соответствующими «*.jpg», которые являются файлами (введите -f).
  • -print0: имена будут завершаться нулевым символом, а пробелы и странные символы будут учтены.
  • xargs -0: xargs также будет считать имена файлов заканчивающимися нулем, а пробелы и странные символы не вызовут проблем.
  • rm -v -rf «<>»: rm будет подробным и сообщит о том, что происходит ( -v ). Он будет рекурсивным (-r) и будет просматривать вложенные подкаталоги и удалять файлы без запроса (-f). «<>» заменяется каждым именем файла.

Выполняется поиск во всех подкаталогах, и файлы, соответствующие шаблону поиска, удаляются.

Удаление вложенных каталогов

Допустим, мы хотим удалить набор вложенных подкаталогов. дерево позволит нам их увидеть.

Эта команда будет использовать find для рекурсивного поиска в текущем каталоге. Целью поиска является каталог с именем «level_one». Имена каталогов передаются через xargs в rm .

Единственное существенное отличие этой команды от предыдущей заключается в том, что условием поиска является имя самого верхнего каталога, а -type d указывает, что find нужно искать каталоги, а не файлы.

Имя каждого каталога печатается по мере его удаления. Мы можем проверить с деревом:

Все вложенные подкаталоги удаляются.

Удаление всех файлов, кроме файлов одного типа

Мы можем использовать find , xargs и rm для удаления всех файлов, кроме одного типа, который мы хотим сохранить. Это немного нелогично, но мы указываем имя типа файла, который хотим сохранить, а не имя файла, который хотим удалить.

Опция -not указывает, что find возвращает имена файлов, которые не соответствуют шаблону поиска. Мы снова используем опцию -I (начальные аргументы) с xargs. На этот раз токен замены строки, который мы определяем, — «<>». Это будет вести себя точно так же, как токен замены строки, который мы создали ранее, который оказался «%».

Мы можем проверить с помощью ls . В каталоге остались только те файлы, которые соответствуют шаблону поиска «*.sh».

Создание файла архива с Xargs

Мы можем использовать find для поиска файлов и передачи их через xargs в tar для создания файла архива.

Мы будем искать в текущем каталоге. Шаблон поиска — «*.page», поэтому мы будем искать файлы «.page».

Файлы перечислены, как и ожидалось, поскольку файл архива создан.

Посредник данных

Иногда вам нужны небольшие леса, когда вы складываете вещи вместе. xargs устраняет разрыв между командами, которые могут выкачивать информацию, и командами, которые не предназначены для ее приема.

И xargs, и find имеют огромное количество опций. Вам предлагается посетить их справочные страницы, чтобы узнать больше.

< /tbody>
Команды Linux
Файлы tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm
Процессы alias · screen · top · nice · renice · прогресс · strace · systemd · tmux · chsh · история · at · пакетное · бесплатное · которое · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · стена · yes · kill · спать · sudo · su · время · groupadd · usermod · группы · lshw · выключение · перезагрузка · halt · poweroff · passwd · lscpu · crontab · date · bg · fg
Сеть netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · копать · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw
  • › Как использовать curl для загрузки файлов из командной строки Linux
  • › Как использовать команду find в Linux
  • › Как использовать каналы в Linux
  • › Как восстановить метки панели задач в Windows 11
  • › Что означает XD и как вы его используете?
  • › Почему прозрачные чехлы для телефонов желтеют?
  • ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
  • › Худшее, что есть в телефонах Samsung, — это программное обеспечение Samsung.

Читайте также: