Если вы только начинаете работать с командной строкой в Linux, то команда xargs может показаться сложной. Но на самом деле она очень полезна и помогает автоматизировать задачи, связанные с обработкой списков файлов или команд.
В этой статье мы рассмотрим 13 примеров распространенного использования команды xargs удобных для начинающих пользователей Linux. Эти примеры помогут вам лучше понять, как применять xargs в повседневных задачах.
Что такое команда xargs?
Команда xargs используется для преобразования входных данных (обычно из стандартного ввода) в аргументы для другой команды. Это особенно удобно, когда нужно выполнить одну и ту же операцию над множеством файлов или элементов списка.
Часто входными данными служит вывод таких команд как find, ls и echo. А так же широко применяется и их комбинация. Перейдём к практическим примерам, и разберемся, как это работает.
- 1. Поиск и удаление пустых файлов
- 2. Поиск и изменения прав доступа
- 3. Поиск и вывод информации
- 4. Отбор и статистика содержимого
- 5. Отбор и архивирование
- 6. Отбор и вывод содержимого
- 7. Копирование в несколько директорий
- 8. Использование переменных
- 9. Поиск по тексту и удаление
- 10. Поиск по тексту и вывод
- 11. Отбор и прерывание процессов
- 12. Отбор и прерывание запросов к базе
- 13. Поиск и переназначение владельца
Я подготовил песочницу следующего вида, где я буду выполнять команды:
[root@waky xargs_sandbox]# ls -lR ./
./:
итого 10016
drwxr-xr-x. 2 root root 6 июл 24 04:41 dir1
drwxr-xr-x. 2 root root 6 июл 24 04:41 dir2
-rw-r--r--. 1 root root 0 июл 24 04:40 empty.file
-rw-r--r--. 1 root root 5 июл 24 04:45 file1.txt
-rw-r--r--. 1 root root 5 июл 24 04:45 file2.txt
-rw-r--r--. 1 apache apache 10240000 июл 24 04:43 image.jgp
-rw-r--r--. 1 root root 12 июл 24 04:50 script.sh
-rw-r--r--. 1 root root 17 июл 24 04:51 spam.email
./dir1:
итого 0
./dir2:
итого 0
[root@waky xargs_sandbox]#
В текущей директории находятся две пустые директории dir1 и dir2. Пустой файл empty.file. Два текстовых файла file1.txt и file2.txt с содержанием test и text соответственно. Файл весом больше 5 Мб image.jgp и владельцем apache. Файл скрипта script.sh, без права на исполнение. И файл spam.email с адресом spam@example.com внутри.
Использование с find
1. Поиск и удаление пустых файлов
Поиск пустых файлов осуществляется с помощью команды find. Давайте сначала посмотрим, какой результат возвращает такая выборка:
[root@waky xargs_sandbox]# find ./ -type f -empty
./empty.file
[root@waky xargs_sandbox]#
У нас в директории есть только один пустой файл, его то и передаст xargs команде rm в качестве аргумента:
[root@waky xargs_sandbox]# find ./ -type f -empty | xargs rm
[root@waky xargs_sandbox]# ls
dir1 dir2 file1.txt file2.txt image.jgp script.sh spam.email
[root@waky xargs_sandbox]#
Как видим, файл empty.file был удален.
2. Поиск и изменения прав доступа
В директории присутствует файл с владельцем и группой apache:
[root@waky xargs_sandbox]# find ./ -user apache
./image.jgp
[root@waky xargs_sandbox]#
Найдем файлы, принадлежащие apache и передадим их команде chown для смены принадлежности на nginx:
[root@waky xargs_sandbox]# find ./ -user apache | xargs chown nginx:nginx
[root@waky xargs_sandbox]# ls -l
итого 10016
drwxr-xr-x. 2 root root 6 июл 24 04:41 dir1
drwxr-xr-x. 2 root root 6 июл 24 04:41 dir2
-rw-r--r--. 1 root root 5 июл 24 04:45 file1.txt
-rw-r--r--. 1 root root 5 июл 24 04:45 file2.txt
-rw-r--r--. 1 nginx nginx 10240000 июл 24 04:43 image.jgp
-rw-r--r--. 1 root root 12 июл 24 04:50 script.sh
-rw-r--r--. 1 root root 17 июл 24 04:51 spam.email
[root@waky xargs_sandbox]#
3. Поиск и вывод информации
Если мы хотим, например, узнать вес файлов больше 5Мб, мы отбираем их с помощью команды find и передаем du:
[root@waky xargs_sandbox]# find ./ -size +5M | xargs du -sh
9,8M ./image.jgp
[root@waky xargs_sandbox]#
Использование с ls
4. Отбор и статистика содержимого
Используя команду ls отберем файлы с расширением .txt и передадим их команде wc, для подсчета количества строк, слов и байт в каждом:
[root@waky xargs_sandbox]# ls *.txt | xargs wc
1 1 5 file1.txt
1 1 5 file2.txt
2 2 10 итого
[root@waky xargs_sandbox]#
5. Отбор и архивирование
Выбираем все файлы с file в начале названия и делаем из них архив с помощью команды tar:
[root@waky xargs_sandbox]# ls file* | xargs tar -czf files.tar.gz
[root@waky xargs_sandbox]# ls
dir1 dir2 file1.txt file2.txt files.tar.gz image.jgp script.sh spam.email
[root@waky xargs_sandbox]#
6. Отбор и вывод содержимого
Отберем текстовые файлы:
[root@waky xargs_sandbox]# ls *.txt
file1.txt file2.txt
[root@waky xargs_sandbox]#
Можем передать эти файлы сразу команде cat, чтобы вывести их содержание:
[root@waky xargs_sandbox]# ls *.txt | xargs cat
test
text
[root@waky xargs_sandbox]#
Использование с echo
7. Копирование в несколько директорий
Нельзя скопировать файл сразу в несколько директорий только средствами cp, но если передать данной команде несколько директорий как отдельные аргументы, копирование будет выполнено для каждого:
[root@waky xargs_sandbox]# echo dir1 dir2 | xargs -n 1 cp image.jgp
[root@waky xargs_sandbox]# ls dir*/
dir1/:
image.jgp
dir2/:
image.jgp
[root@waky xargs_sandbox]#
8. Использование переменных
Мы можем использовать системные или пользовательские переменные выводя их с помощью echo. Например, вернуть все файлы скриптов из директории xargs_sandbox находящейся в домашней директории текущего пользователя ($HOME) и добавить им право на исполнение командой chmod:
[root@waky xargs_sandbox]# echo $HOME/xargs_sandbox/*.sh | xargs chmod u+x
[root@waky xargs_sandbox]# ls -l
итого 10020
drwxr-xr-x. 2 root root 23 июл 24 05:42 dir1
drwxr-xr-x. 2 root root 23 июл 24 05:42 dir2
-rw-r--r--. 1 root root 5 июл 24 04:45 file1.txt
-rw-r--r--. 1 root root 5 июл 24 04:45 file2.txt
-rw-r--r--. 1 root root 147 июл 24 05:25 files.tar.gz
-rw-r--r--. 1 nginx nginx 10240000 июл 24 04:43 image.jgp
-rwxr--r--. 1 root root 12 июл 24 04:50 script.sh
-rw-r--r--. 1 root root 17 июл 24 04:51 spam.email
[root@waky xargs_sandbox]#
Как итог, у нас поменялись правила доступа для файла script.sh.
Использование с grep
9. Поиск по тексту и удаление
Если на вашем сервере обрабатывается почта, то вы наверняка сталкивались большим количеством спама. Такие письма обычно легко сгруппировать по общему признаку, например, теме письма или очевидно левому адресу отправителя. Тогда по этому признаку можно по тексту совершить поиск с помощью команды grep и удалить письма со спамом:
[root@waky xargs_sandbox]# grep -rl @example.com ./ | xargs rm
[root@waky xargs_sandbox]# ls
dir1 dir2 file1.txt file2.txt files.tar.gz image.jgp script.sh
[root@waky xargs_sandbox]#
Удален файл spam.email в котором был указан адрес заведомо недействительный адрес @example.com
10. Поиск по тексту и вывод
Отберем текстовые файлы, в которых нет слова test, и выведем их содержимое:
[root@waky xargs_sandbox]# grep -rlv test ./*.txt | xargs cat
text
[root@waky xargs_sandbox]#
Комбинация нескольких команд
Следующие примеры более комплексные и выходят за рамки нашей песочницы. Убедитесь, что полностью понимаете все составляющие команд, прежде чем применять их на рабочем сервере.
11. Отбор и прерывание процессов
Администрируя свой сервер, вы будете сталкиваться с ситуацией, когда какие либо процессы зависают или работают недолжным образом. Например если нужно прибить зависшие php процессы:
[root@waky ~]# ps aux | grep 'php-fpm: pool www' | awk '{print $2}' | xargs kill
В разных системах, процессы могут называться отлично от ‘php-fpm: pool www’, используйте актуальное для вашей ситуации название.
12. Отбор и прерывание запросов к базе
Еще одно место, где может случиться затык на веб сервере – база данных. активность ботов может породить большое количество запросов к базе, в основном это запросы типа SELECT, такие запросы можно прервать без нарушения консистентности данных.
[root@waky ~]# mysqladmin processlist | grep "SELECT" | awk '{print $2}' | xargs -L1 mysqladmin kill
Мы выводим список текущих запросов, отбираем селекты и прерываем их.
13. Поиск и переназначение владельца
Предположим, что мы переносили файлы сайта с одного сервера на другой. Чтобы найти файлы с неправильным владельцем, сначала с помощью grep берем из файла настроек nginx правильное имя пользователя, а затем передаем его команде find, чтобы найти файлы несоответствующие данному пользователю:
[root@waky ~]# grep ^user /etc/nginx/nginx.conf | awk '{print $2}' | sed 's/;//g' | xargs find /usr/share/nginx/html/ -not -user
Данный пример очень индивидуален, используйте пути, соответствующие вашей конфигурации.
Заключение
Команда xargs — мощный инструмент для работы с множеством данных в Linux. Она помогает автоматизировать рутинные задачи, такие как удаление, копирование или обработка файлов.
Надеюсь, вы легко адаптируете приведенные примеры для практического использования в ваших условиях.
Не бойтесь пробовать разные сочетания команд для достижения наиболее точного результата, так вы закрепите базовые принципы xargs и расширите свои возможности.