Главная > Среда и утилиты > xargs

xargs: построение и выполнение командных строк из стандартного ввода

Команда xargs считывает элементы из стандартного ввода (stdin), использует их для построения списков аргументов для других команд и затем выполняет эти команды. Это очень полезно для автоматизации сложных задач, таких как преобразование нескольких строк ввода, передаваемых через конвейер (|), в аргументы одной команды или ограничение количества аргументов, обрабатываемых за один раз.

Обзор

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

Основные функции

  • Преобразование данных из стандартного ввода в аргументы команды
  • Ограничение количества аргументов при выполнении команды
  • Поддержка параллельной обработки
  • Безопасная обработка имен файлов, содержащих специальные символы

Основные опции

Основные опции команды xargs используются для настройки способа обработки ввода, управления выполнением команды и форматирования вывода.

Обработка ввода

Управление выполнением

Сгенерированная команда:

Комбинируйте команды.

Описание:

`xargs` Запускает команду.

Комбинируйте эти опции, чтобы виртуально выполнять команды с помощью ИИ.

Примеры использования

xargs может гибко использоваться в различных сценариях. Ниже приведены несколько распространенных примеров использования.

Базовое использование: удаление нескольких файлов

echo "file1.txt file2.txt" | xargs rm

Передает имена файлов, полученные из стандартного ввода, в качестве аргументов команде rm для удаления.

Безопасное удаление файлов с помощью find

find . -name "*.bak" -print0 | xargs -0 rm

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

Выполнение команды для каждого файла (строка замены)

find . -name "*.log" | xargs -I {} mv {} {}.old

Выполняет команду mv для каждого найденного файла .log, изменяя расширение на .old.

Параллельное подключение к нескольким хостам по SSH

cat hostnames.txt | xargs -P 5 -I {} ssh {} "uptime"

Одновременно пытается установить 5 SSH-соединений к каждому хосту из файла hostnames.txt для проверки статуса uptime.

Запрос подтверждения перед выполнением

ls *.tmp | xargs -p rm

Перед удалением всех файлов .tmp в текущем каталоге запрашивает подтверждение для каждого файла.

Советы и предостережения

Советы и моменты, на которые следует обратить внимание при эффективном использовании xargs.

Безопасная обработка имен файлов

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

  • Всегда используйте `find -print0` в сочетании с `xargs -0`
  • По умолчанию разделение происходит по пробелам, поэтому при наличии пробелов в именах файлов могут возникнуть проблемы

Осторожность при выполнении опасных команд

Будьте предельно осторожны при использовании xargs с командами, изменяющими систему, такими как rm, mv, chown. Рекомендуется использовать опцию `-p` для подтверждения перед каждым выполнением или опцию `-t` для предварительного просмотра выполняемых команд.

  • Подтверждение перед выполнением с опцией `-p` (prompt)
  • Просмотр выполняемых команд с опцией `-t` (trace)
  • Сначала протестируйте с помощью `echo` и т.п., чтобы убедиться в правильности работы

xargs против цикла for

Для простых задач цикл for в оболочке может быть более интуитивным, но когда требуется обработать большое количество файлов/элементов, необходима параллельная обработка или превышен лимит длины командной строки, xargs является более эффективной и мощной альтернативой.

  • Обработка большого количества файлов: `xargs` более эффективен по памяти
  • Параллельная обработка: `xargs -P`
  • Ограничение длины командной строки: `xargs` автоматически разделяет

Те же команды в категории