- Как использовать команду xargs в Linux
- Сценарий 1: подсчет количества строк во всех файлах
- Сценарий 2: вывод первой строки каждого из заданных файлов
- Сценарий 3: Обработка каждого файла с помощью скрипта
- Заключение
- Команда Xargs для начинающих с примерами
- Использование команды xargs
- Как просмотреть команду и запросить подтверждение пользователя
- Как ограничить количество аргументов
- Как запустить несколько команд
- Как указать разделитель
- Как читать элементы из файла
- Использование xargs с find
- Использование xargs для обрезки пробелов
- Заключение
- Команда Xargs в Linux
- Принцип действия и синтаксис
- Опции
- Примеры xargs
- Создание конвейеров
- Использование xargs с другими командами
- Многократное выполнение команды (для каждой строки/аргумента)
- Обработка имен файлов с пробелами
- Получение входных данных из файла
- Запрос разрешения пользователя перед выполнением команды
- Заключение
Как использовать команду xargs в Linux
Попадали ли вы когда-нибудь в ситуацию, когда вам нужно запускать одну и ту же команду много раз подряд? Если да, то вы понимаете, насколько это скучно и неэффективно. А хорошая новость в том, что в операционных системах на базе Unix есть замечательная команда xargs, которая позволяет решить эту проблему.С помощью этой команды вы можете очень эффективно работать с большим количеством файлом, экономя свое время и нервы. В этой статье вы увидите, как это делается.
У команды xargs есть два компонента. Во-первых, вы должны указать файлы, которые вас интересуют. Во-вторых, вы должны задать команду или скрипт, который вы хотите применить к каждому из этих файлов.
В этом руководстве мы рассмотрим три сценария использования команды xargs для обработки файлов, расположенных в нескольких разных директориях:
1. Подсчет количества строк во всех файлах.
2. Вывод первой строки заданных файлов.
3. Обработка каждого файла с помощью заданного скрипта.
Рассмотрим директорию с именем xargstest (дерево директорий можно вывести с помощью команды tree с опциями -i и -f, которые позволяют вывести результаты без отступов и с полным префиксом пути для каждого файла):
Содержимое каждого из шести файлов:
Директория xargstest, ее поддиректории и файлы будут далее использоваться в наших примерах.
Сценарий 1: подсчет количества строк во всех файлах
Как говорилось ранее, первым компонентом команды xargs является список файлов, с которыми работает команда. Для того, чтобы индентифицировать эти файлы и вывести их спиоск, можно воспользоваться командой find. Опция -name ‘file??’ показывает, что нас интересуют только файлы, чье название начинается с «file», после чего в названии есть еще два любых любых символа. Поиск производится в директории xargstest, причем поиск осуществляется рекурсивно, то есть и во всех поддиректориях xargstest (если они имеются).
Мы можем перенаправить результаты поиска в команду sort, чтобы упорядочить их по имени:
Теперь нам нужен второй компонент, представляющий собой команду, которую мы хотим выполнить. Для подсчета количества строк в каждом файле мы будем использовать команду wc с опцией -l (количество строк отображается в начале каждой строки вывода):
Вы видите, что вместо того, чтобы вручную запускать команду wc -l для каждого из этих файлов, xargs позволяет выполнить эту операцию одной командой. Вы можете легко осуществлять различные операции с сотнями файлов.
Сценарий 2: вывод первой строки каждого из заданных файлов
Теперь, когда вы в общем понимаете, как использовать команду xargs, вы имеете полную свободу в выборе команды для выполнения. Иногда вам может понадобиться обработать только некоторую выборку файлов, но не все, расположенные в данной директории. В таком случае необходимо воспользоваться командой find с опцией -name для того, чтобы выбрать требуемые файлы и перенаправить их в команду xargs. Например, если вам нужно вывести первую строку всех файлов, имена которых заканчиваются на «B», используется следующая комбинация команд find, xargs и head (head -n1 выводит первую строку файла):
Вы видите, что обрабатываются только файлы, чье имя заканчивается на «B», остальные игнорируются.
Сценарий 3: Обработка каждого файла с помощью скрипта
Наконец, у вас может быть свой скрипт (написанный на Bash, Python, или, например, на Perl) для обработки файлов. Просто подставьте его имя вместо команд wc и head в предыдущем примере.
Необходимо, чтобы скрипт myscript.sh был написан таким образом, чтобы он принимал имя файла в качестве аргумента и обрабатывал этот файл. Приведенная выше команда будет применять этот скрипт к каждому файлу, найденному командой find.
Обратите внимание, что в вышеприведенных примерах имена файлов не содержат пробелов. В целом можно сказать, что жизнь в Linux значительно приятнее в том случае, если вы не используете пробелы в именах файлов. Если же вам необходимо обработать файлы, чьи названия включают пробелы, приведенная выше команда не будет работать. Ее необходимо немного модифицировать, добавив опцию «-print0» к команде find (которая выводит полное имя с символом «null» после него в stdout) и опцию «-0» к команде xargs (которая интерпретирует символ «null» в конце строки), как показано ниже:
Обратите внимание, что аргумент для опции -name изменился на ‘file*’, что подразумевает любые файлы с именами, начинающимися с «file» и заканчивающимися любыми символами.
Заключение
После прочтения этого руководства вы будете знать возможности команды xargs и как вы можете использовать их в своей работе. Скоро вы будете тратить гораздо меньше времени на выполнение повторяющихся задач. Если вы хотите узнать обо всех опциях и возможностях команды xargs, просто наберите в терминале:
Источник
Команда Xargs для начинающих с примерами
Оригинал: Linux Xargs Command with Examples
Автор: linuxize
Дата публикации: 21 декабря 2019 года
Перевод: А. Кривошей
Дата перевода: январь 2020 г.
Утилита xargs позволяет создавать и выполнять команды из стандартного ввода.
Xargs обычно используется в сочетании с другими командами через конвейер. Использование xargs позволяет вам предоставлять стандартный ввод в качестве аргументов утилит командной строки, таких как mkdir и rm.
В этом руководстве мы рассмотрим основы использования команды xargs.
Использование команды xargs
Xargs читает аргументы из стандартного ввода, разделенные пробелами или символами новой строки, и выполняет указанную команду, используя входные данные в качестве аргументов команды. Если команда не указана, по умолчанию используется /bin/echo.
Синтаксис команды xargs выглядит следующим образом:
Самый простой пример использования xargs — передать несколько строк, разделенных пробелами, с помощью канала в xargs и запустить команду, которая будет использовать эти строки в качестве аргументов.
В приведенном выше примере мы передаем стандартный ввод в xargs, и для каждого аргумента запускается команда touch, создавая три файла. Это то же самое, как если бы вы запустили:
Как просмотреть команду и запросить подтверждение пользователя
Чтобы вывести команду на терминал перед ее выполнением, используйте опцию -t (—verbose):
Если вы хотите получить подтверждение выполнения команды, используйте параметр -p (—interactive):
Введите y или Y, чтобы подтвердить и выполнить команду:
Этот ключ полезен при выполнении потенциально опасных команд.
Как ограничить количество аргументов
По умолчанию количество аргументов, передаваемых команде, определяется системным лимитом.
Опция -n (—max-args) указывает количество аргументов, передаваемых данной команде. Xargs будет запускать указанную команду столько раз, сколько необходимо, пока не будут исчерпаны все аргументы.
В следующем примере количество аргументов, считываемых из стандартного ввода, ограничено 1.
Как вы можете видеть из подробного вывода ниже, команда touch выполняется отдельно для каждого аргумента:
Как запустить несколько команд
Чтобы запустить несколько команд с xargs, используйте опцию -I. Она работает путем определения replace-str после ключа -I, а затем все вхождения replace-str заменяются аргументом, переданным в xargs.
В следующем примере xargs будут запущены две команды, сначала она создаст файлы с помощью touch, а затем выведет список файлов с помощью команды ls:
Типичным выбором для replace-str является %, однако вы можете использовать другой заполнитель, например ARGS:
Как указать разделитель
Используйте параметр -d (—delimiter), чтобы задать пользовательский разделитель, который может быть либо отдельным символом, либо escape-последовательностью, начинающейся с \.
В следующем пример мы используем «;» в качестве разделителя:
Как читать элементы из файла
Команда xargs также может читать элементы из файла вместо стандартного ввода. Для этого используйте параметр -a (—arg-file), за которым следует имя файла.
В следующем примере команда xargs будет читать файл ips.txt и пинговать каждый IP-адрес.
Мы также используем опцию -L 1, которая указывает xargs читать по одной строке за раз. Если эта опция не указана, xargs передает все IP-адреса одной команде ping.
Использование xargs с find
xargs чаще всего используется в сочетании с командой find. Вы можете использовать find для поиска определенных файлов, а затем использовать xargs для выполнения операций с этими файлами.
Чтобы избежать проблем с именами файлов, которые содержат символы новой строки или другие специальные символы, всегда используйте параметр find -print0, который заставит find печатать полное имя файла, за которым следует нулевой символ. Этот вывод может быть правильно интерпретирован xargs с помощью опции -0, (—null).
В следующем примере команда find выведет полные имена всех файлов в каталоге /var/www/.cache, а xargs передаст пути к файлам команде rm:
Использование xargs для обрезки пробелов
Xargs также можно использовать как инструмент для удаления пробелов с обеих сторон заданной строки. Просто передайте строку в команду xargs, и она выполнит обрезку:
Это может быть полезно при сравнении строк в скриптах оболочки.
Заключение
К настоящему времени вы должны хорошо понимать, как использовать команду Linux xargs. Для получения более подробной информации о каждой опции xargs прочитайте справочную страницу xargs.
Источник
Команда Xargs в Linux
Может быть, команда xargs — не очень популярная утилита командной строки, но от этого она не становится менее полезной, особенно в сочетании с другими командами, например, find и grep. Если вы никогда не пользовались командой xargs и хотите разобраться, как она работает, данное руководство вам поможет.
Принцип действия и синтаксис
Прежде чем рассматривать примеры применения, важно разобраться с принципом действия команды. Говоря простыми словами, эта утилита считывает данные из выходных данных другой команды или стандартного потока ввода (по умолчанию) и выполняет команду, переданную в качестве аргумента. Один или несколько раз в зависимости от входных данных. Все пропуски и пробелы во входных данных воспринимаются как разделители, пустые строки игнорируются. Таким образом, в общем виде синтаксис команды следующий:
Если команда в качестве аргумента не передается, по умолчанию утилита выполняет команду echo. Например, в следующем примере мы просто выполнили команду без опций и ввели текст ‘Hello, World!’ в стандартный поток ввода. После нажатия Ctrl+D (чтобы сообщить xargs о завершении ввода), была автоматически выполнена команда echo, и на экран снова был выведен текст ‘Hello, World!’.
Опции
-0- Использует во входном потоке символ-разделитель NULL («\0») вместо «пробела» и «перевода строки», хорошо сочетается с опцией -print0 команды find
-l [число] -Выполнять команду для каждой группы из заданного числа непустых строк аргументов, прочитанных со стандартного ввода. Последний вызов команды может быть с меньшим числом строк аргументов. Считается, что строка заканчивается первым встретившимся символом перевода строки, если только перед ним не стоит пробел или символ табуляции; пробел/табуляция в конце сигнализируют о том, что следующая непустая строка является продолжением данной. Если число опущено, оно считается равным 1. Опция -l включает опцию -x.
-I [зам_цеп] Режим вставки: команда выполняется для каждой строки стандартного ввода, причём вся строка рассматривается как один аргумент и подставляется в начальные_аргументы вместо каждого вхождения цепочки символов зам_цеп. Допускается не более 5 начальных_аргументов, содержащих одно или несколько вхождений зам_цеп. Пробелы и табуляции в начале вводимых строк отбрасываются. Сформированные аргументы не могут быть длиннее 255 символов. Если цепочка зам_цеп не задана, она полагается равной < >. Опция -I включает опцию -x.
-n [число] Выполнить команду, используя максимально возможное количество аргументов, прочитанных со стандартного ввода, но не более заданного числа. Будет использовано меньше аргументов. Если их общая длина превышает размер (см. ниже опцию -s). Или если для последнего вызова их осталось меньше, чем заданное число. Если указана также опция -x, каждая группа из указанного числа аргументов должны укладываться в ограничение размера, иначе выполнение xargs прекращается.
-t Режим трассировки: команда и каждый построенный список аргументов перед выполнением выводится в стандартный поток ошибок.
-p Режим с приглашением: xargs перед каждым вызовом команды запрашивает подтверждение. Включается режим трассировки (-t), за счет чего печатается вызов команды, который должен быть выполнен, а за ним — приглашение ?…. Ответ y (за которым может идти что угодно) приводит к выполнению команды; при каком-либо другом ответе, включая возврат каретки, данный вызов команды игнорируется.
-x Завершить выполнение, если очередной список аргументов оказался длиннее, чем размер (в символах). Опция -x включается опциями -i и -l. Если ни одна из опций -i, -l или -n не указана, общая длина всех аргументов должна укладываться в ограничение размера.
-s [размер] Максимальный общий размер (в символах) каждого списка аргументов установить равным заданному размеру. Размер должен быть положительным числом, не превосходящим 470 (подразумеваемое значение). При выборе размера следует учитывать, что к каждому аргументу добавляется по одному символу; кроме того, запоминается число символов в имени команды.
-e [лконф_цеп] Цепочка символов лконф_цеп считается признаком логического конца файла. Если опция -e не указана, признаком конца считается подчеркивание (_). Опция -e без лконф_цеп аннулирует возможность устанавливать логический конец файла (подчеркивание при этом рассматривается как обычный символ). Команда xargs читает стандартный ввод до тех пор, пока не дойдет до конца файла или не встретит цепочку лконф_цеп.
Примеры xargs
Ниже рассмотрим наиболее часто используемые примеры команды xargs
Создание конвейеров
Команда xargs очень полезна при создании конвейеров команд. Это самый частый случай использования команды В этом случае результат выполнения предыдущей команды передается как аргумент в xargs.
Например поиск файлов, содержащих заданную строку или текст. Например, поиск всех файлов с расширением txt, содержащих текст ‘abc’, можно выполнить следующим образом:
Вот результат выполнения команды:
В данном случае команда xargs получает входные данные от команды find. И поочередно применяет название файла к команде grep. Которая в свою очередь уже ищет строку в файле.
Просмотр файлов в текущем рабочем каталоге и всех подкаталогов в двух столбцах:
Удалить файлы, созданные более 10 дней назад в директории /tmp
Массовая смена группы пользователей.
Эта команда сменит группу владельцев с root на user на все файлы и каталоги в текущей директории.
Выше приведенных примеров достаточно что бы стало понятно как можно использовать команду xargs. И на основе этих примеров строить уже свои конструкции по использованию. А пока рассмотрим еще несколько примеров.
Использование xargs с другими командами
По умолчанию xargs выполняет команду echo, но можно в явном виде указать любую другую команду. Например, можно передать в качестве аргумента команду find с опцией -name, а затем ввести в стандартном потоке ввода имя файла (или тип файлов), который вы хотите найти.
Введем в стандартном потоке ввода «*.txt», что означает поиск всех файлов с расширением txt в текущей директории и всех ее поддиректориях:
Многократное выполнение команды (для каждой строки/аргумента)
В предыдущем примере нам требовался поиск файлов с расширением txt, поэтому мы ввели в строке ввода «*.txt». Но что если нужно также найти другие типы файлов, например, .log и .tmp?
Попробуйте ввести их при выполнении команды xargs после «*.txt». Вы получите ошибку следующего вида:
Это происходит потому, что xargs передает «*.txt» и «*.log» в качестве одного имени файла команде find, которая затем запускается с двумя именами файлов в качестве аргументов:
Такой синтаксис не является корректным. Нам нужно, чтобы команда xargs выполнила многократное выполнение команд. Сначала передала команд find аргумент «*.txt», и мы получили результат для расширения txt. А затем был передан аргумент «*.log». Это можно реализовать при помощи опции командной строки -L.
После этой опции необходимо указать число, которое означает максимальное количество непустых строк, которые за раз передаются команде в качестве входных данных. В нашем случае это значение будет равно 1. Так как нам требуется передача команде find одной строки за раз в качестве входных данных.
Команда будет иметь следующий вид:
А результат будет следующим:
Все работает. Теперь попытаемся ввести аргументы так:
Выполнение команды вызовет ошибку, потому что ‘-L 1’ обеспечивает передачу команде find всей строки целиком.
Для таких ситуаций можно воспользоваться опцией командной строки -n.
После опции -n, как и в случае с -L, требуется указать число, означающее количество аргументов, которые xargs должна передать команде за раз. В рассматриваемом нами случае «*.txt» и «*.log» должны быть разными аргументами. Поэтому для их передачи по отдельности нужно указать опцию -n со значением 1.
Обработка имен файлов с пробелами
В начале данной статьи было сказано, что xargs воспринимает пробелы (а также символы новой строки) как разделители. В случае, если передаваемые имена файлов содержат пробелы, это может вызвать проблемы.
Например, в текущей директории есть файл с именем ‘new music.mp3’. И требуется передать его проигрывателю mplayer, чтобы воспроизвести музыку. Если указать его обычным способом, это вызовет ошибку:
Она возникает из-за пробела между ‘new’ и ‘music.mp3’, из-за которого эти части имени воспринимаются проигрывателем как два разных файла. Один из способов решения этой проблемы — ввести перед пробелом обратный слэш:
Однако, если ввод осуществляется не из стандартного потока ввода, это может быть неудобным. Поэтому есть и другой способ — изменить разделитель при помощи опции -d:
Данная команда будет воспринимать в качестве разделителя только символ новой строки.
Получение входных данных из файла
В рассмотренных выше примерах мы получали входные данные из стандартного потока ввода (по умолчанию) или от другой команды. Однако, при необходимости источником входных данных для xargs может быть файл.
Для этого используется опция -a. После которой нужно указать имя файла, используемого xargs в качестве источника входных данных.
Допустим, есть файл ‘input.txt’, содержащий входные данные для xargs (в нашем случае это имя двух директорий: /tmp и /mnt). Ниже приведен пример, как команда xargs может считать данные из этого файла и передать их другой команде, в данном случае ls:
xargs -a input.txt ls -lart
Результат выполнения команды:
Запрос разрешения пользователя перед выполнением команды
Мы уже рассмотрели, как обеспечить многократное выполнение команды. Но нам может потребоваться подтверждение пользователя при каждом запуске. Это можно сделать при помощи опции командной строки -p.
Как видим прежде чем удалить файлы команда запросила подтверждение
Заключение
Мы разобрали самые необходимые базовые функции команды xargs, необходимые для работы с этой полезной утилитой. Освоив принципы работы и функции команды, рассмотренные в данном руководстве, вы можете обратиться к соответствующей man-странице.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник