Для некоторых из более опытных пользователей мы всегда ищем новые способы работать умнее, а не усерднее за терминалом. xargs - полезная команда, которая действует как мост между двумя командами, считывая вывод одной и выполняя другую с прочитанными элементами. Команда чаще всего используется в сценариях, когда пользователь ищет шаблон, удаляет и переименовывает файлы и т. Д. Здесь мы покажем вам, как использовать эту xargs команду в ваших интересах.
Что такое xargs?
В своей базовой форме xargs считывает информацию со стандартного ввода (или STDIN) и выполняет команду один или несколько раз с прочитанными элементами. Есть много простых демонстраций, но вот одна, которая показывает, что я имею в виду.
Чтобы xargs выполнить ls команду в моей папке с документами, я бы выполнил следующую команду:
- echo "Documents" | xargs ls
Символ вертикальной черты | передает все, что предшествует этому, как STDIN для xargs .
Как видите, xargs моя папка «Документы» читается без проблем. Это всего лишь один пример возможностей xargs команды.
Хотя xargs команду можно использовать в различных операциях командной строки, она очень удобна при использовании с find командой. В этой статье мы обсудим несколько полезных примеров, чтобы понять, как xargs и find можно использовать вместе.
Операции с участием нескольких файлов
Предположим, вы хотите скопировать содержимое «ref.txt» во все текстовые файлы, находящиеся в каталоге. Хотя в противном случае задача может потребовать от вас выполнения нескольких команд, xargs команда вместе с find командой упрощает ее. У меня есть пара тестовых каталогов. В одном есть «test0.txt», который содержит текст, а в другом каталоге есть еще 10 тестовых файлов без текста. Если бы я хотел взять содержимое test0.txt и скопировать его в остальные текстовые файлы в других каталогах, я бы выполнил следующую команду:
find ./ test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
Чтобы понять команду, показанную выше, давайте разделим ее на две части.
Первая часть - find ./test-dir1/ -name "*.txt" это поиск всех файлов .txt, находящихся в каталоге «test-dir1». Здесь вы можете указать любую директорию.
Вторая часть xargs -n1 cp test.txt ,, захватит вывод первой команды (получившиеся имена файлов) и по очереди передаст их команде cp (копировать). Обратите внимание, что этот -n параметр имеет решающее значение, поскольку он указывает xargs использовать один аргумент для каждого выполнения.
При объединении вместе полная команда скопирует содержимое «test0.txt» во все файлы .txt в каталоге.
Операции с большим количеством аргументов
Одним из основных преимуществ использования xargs является его способность обрабатывать большое количество аргументов. Например, при удалении большого количества файлов за один раз rm команда иногда завершалась ошибкой с ошибкой « Список аргументов слишком длинный ». Это потому, что он не мог просто обработать такой длинный список аргументов. Обычно это происходит, когда в папке, которую вы хотите удалить, слишком много файлов.
Допустим, у вас есть 75 PDF-файлов, и вы получаете сообщение об ошибке при их удалении.
Это легко исправить с помощью xargs . Чтобы удалить все эти файлы, используйте следующую команду:
- find ./ test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
Операции, связанные с поиском по образцу
Разработчики программного обеспечения, а также системные администраторы часто ищут шаблоны, работая в командной строке. Например, разработчик может захотеть быстро взглянуть на файлы проекта, которые изменяют определенную переменную, или системный администратор может захотеть увидеть файлы, которые используют определенный параметр конфигурации системы. В этих сценариях xargs вместе с find и grep упрощает вам задачу.
Например, чтобы найти все файлы «.txt», содержащие строку «maketecheasier», выполните следующую команду:
- find ./ -name "*.txt" | xargs grep "maketecheasier"
Вот результат выполнения команды в моей системе.
Операции вырезания / копирования
Xargs вместе с find командой также можно использовать для копирования или перемещения набора файлов из одного каталога в другой. Например, чтобы переместить все текстовые файлы старше 10 минут из текущего каталога в предыдущий каталог, используйте следующую команду:
- find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
Параметр -I командной строки используется xargs командой для определения строки замены, которая заменяется именами, считанными из вывода find команды. Здесь есть строка замены {} , но это может быть что угодно. Например, вы можете использовать «файл» как заменяющую строку.
- find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./ practice
Как сказать xargs, когда нужно выйти
Предположим, вы хотите перечислить подробную информацию обо всех файлах .txt, находящихся в текущем каталоге. Как уже объяснялось, это легко сделать с помощью следующей команды:
- find . -name "*.txt" | xargs ls -l
Но есть одна проблема: xargs команда выполнит ls команду, даже если ей find не удастся найти какой-либо файл .txt. Ниже приводится пример.
Итак, вы можете видеть, что в каталоге нет файлов .txt, но это не помешало xargs выполнению ls команды. Чтобы изменить это поведение, используйте параметр -r командной строки:
- find . -name "*.txt" | xargs -r ls -l
Заключение
Хотя здесь я сосредоточился на использовании xargs with find , его также можно использовать со многими другими командами. Если у вас есть несколько сложных команд, которые вам нужно выполнить, xargs это очень полезный инструмент.
Если вам понравилась наша статья о том, как использовать xargs команду в Linux, обязательно ознакомьтесь с некоторыми из других наших материалов по Linux