Об утилите xargs написано очень много — что можно написать еще? Но если, что называется, копнуть поглубже, то выясняется, что во многих публикациях излагаются лишь самые основы, но нет главного: не объясняется, как можно применять xargs в реальной практике. Статей с разбором сложных и нетривиальных вариантов применения этого весьма полезного для системного администратора инструмента, к сожалению, очень мало. Именно поэтому мы написали свою статью и постарались включить в нее как можно больше примеров использования xargs для решения различных проблем.
Сначала мы рассмотрим принцип работы xargs и разберем примеры попроще, а затем перейдем к разбору сложных и интересных кейсов.
Принцип работы xargs можно описать следующим образом: программа берет данные из стандартного ввода или из файла, разбивает их в соответствии с указанными параметрами, а затем передает другой программе в качестве аргумента.
В общем виде синтаксис команды xargs можно представить так:
Рассмотрим, как все это работает, на материале простых и хрестоматийных примеров.
Одна из самых частых ситуаций, в которых используется xargs — удаление файлов, найденных при помощи команды find.
Представим себе следующую ситуацию: имеется директория, в которой хранится большое количество файлов. Из нее нужно удалить файлы определенного типа (в нашем примере — файлы с расширением *.sh). Чтобы осуществить эту операцию, нужно передать xargs вывод команды find, и к файлам с указанным расширением будет применена команда -rm:
Отметим, что операцию удаления файлов можно осуществить и без xargs, а с помощью команды
Описанный способ не сработает, если в имени одного из удаляемых файлов содержится пробел. Имя, состоящее из двух слов, разделенных пробелом, не будет воспринято как единое целое.
Проиллюстрируем это следующим примером:
Как видим, файл, в имени которого имеется пробел, не был удалён.
Чтобы решить эту проблему, используется опция print0 для команды find и опция -0 для команды xargs. Она заменяет стандартный разделитель (перенос строки на нуль-символ (\x0), который и означает конец хранимой строки:
Xargs может также помочь, например, быстро удалить все временные файлы, имеющие расширение tmp:
Сжать все файлы в текущей директории с помощью gzip можно, введя следующую команду:
Рассмотрим еще один пример: сжатие с помощью tar всех файлов с расширением *.pl:
С помощью xargs можно осуществлять массовое переименование файлов. Представим себе, что у нас есть группа файлов с расширением *.txt, и нам нужно заменить это расширение на *.sql. Это можно сделать при помощи xargs и потокового текстового редактора sed:
В результате ее выполнения на консоль будет выведен список переименованных файлов.
С помощью xargs можно также добавлять к дополнительные элементы к именам файлов (например, дату):
Вместо <..> можно подставить всё, что угодно.
Фигурные скобки {} в этом примере означают «текущий аргумент» (т.е. текущее имя файла).
С помощью xargs можно также ускорить процесс смены прав на файлы и папки для определенного пользователя или группы. Предположим, нам нужно найти все папки пользователя root и заменить их владельца на temp. Эта операция осуществляется при помощи команды:
Чтобы найти все папки группы root и заменить группу на temp, используется команда:
С помощью команд find и xargs можно выполнять и более сложные операции. Вот так, например, можно удалить временные файлы, созданные более 7 дней назад:
А вот так — принудительно остановить процессы, которые уже работают больше 7 дней:
Xargs довольно часто используется в сочетании с командой cut, позволяющей вырезать строки из текстовых файлов. Рассмотрим некоторые практические примеры. С помощью приведённой ниже команды на консоль будет выведен список всех пользователей системы:
А команда вида
будет последовательно открывать файлы для редактирования в vim.
Обратим внимание на опцию -p. Благодаря ей команда будет выполняться в интерактивном режиме: перед открытием каждого файла будет запрашиваться подтверждение (y/n).
В заключение приведём ещё один сложный и интересный пример — рекурсивный поиск файлов самого большого размера в некоторой директории:
Xargs часто используется для параллельного запуска нескольких процессов. Вот так, например, можно одновременно cжать несколько директорий в tar.gz:
В приведенном примере используется ключ -P. Он указывает максимальное количество процессов, которые будут выполняться одновременно. Предположим, что у нас на входе имеется 10 аргументов. Если мы введём команду xargs с ключoм -P 3, то будет запущено 3 экземпляра команды, следующей после xargs, с каждым из этих аргументов.
С помощью xargs можно также параллельно загружать из Интернета множество файлов:
В приведенном примере с указанного адреса будут скачаны все графические файлы с расширением jpg; ключ -P указывает, что требуется скачивать по 10 файлов одновременно.
Подведём предварительные итоги и сформулируем несколько правил работы с xargs.
Основы мы вспомнили, типичные варианты использования рассмотрели… Перейдем теперь к более сложным и нетривиальным примерам. До некоторых из них мы додумались самостоятельно, работая над повседневными задачами, а некоторые — почерпнули с сайта http://www.commandlinefu.com (всем желающим научиться тонкостям работы с командной строкой очень рекомендуем время от времени его посещать — там порой можно найти очень полезные советы).
Чтобы забанить IP-адреса из списка, нужно их добавить в IP tables c правилом DROP. Эта операция осуществляется при помощи команды:
Можно проделать и более сложную операцию и забанить все адреса по AS:
Преобразовать URL вида «http%3A%2F%2Fwww.google.com» в «www,google.com» можно при помощи команды:
Сгенерировать надежный пароль можно при помощи команды вида:
Генерировать пароли можно и без помощи xargs: для этого cуществует специализированная утилита pwgen. Некоторые другие способы генерации паролей описаны также здесь.
Такая операция может потребоваться в случае, если, например, машина стала жертвой хакерской атаки и на ней было установлено вредоносное программное обеспечение. Выявить, что за программы поставили злоумышленники, поможет следующая команда (она ищет запущенные «бинарники», установленные без использования менеджера пакетов dpkg):
Проблема удаления старых ядер уже обсуждалась на Хабре — см. здесь (по этой же ссылке можно найти любопытные примеры команд).
Иногда возникает необходимость преобразовать большой скрипт в одну строку. Сделать это можно так:
Как видно из проделанного обзора, возможности xargs гораздо шире, чем это может показаться на первый взгляд. Надеемся, что приведённые в статье примеры окажутся для вас полезными. Если вам известны другие интересные варианты использования xargs — добро пожаловать в комментарии.
Источник:habrahabr.ru
Сначала мы рассмотрим принцип работы xargs и разберем примеры попроще, а затем перейдем к разбору сложных и интересных кейсов.
Вспоминаем основы
Принцип работы xargs можно описать следующим образом: программа берет данные из стандартного ввода или из файла, разбивает их в соответствии с указанными параметрами, а затем передает другой программе в качестве аргумента.
В общем виде синтаксис команды xargs можно представить так:
Рассмотрим, как все это работает, на материале простых и хрестоматийных примеров.
Удаление файлов
Одна из самых частых ситуаций, в которых используется xargs — удаление файлов, найденных при помощи команды find.
Представим себе следующую ситуацию: имеется директория, в которой хранится большое количество файлов. Из нее нужно удалить файлы определенного типа (в нашем примере — файлы с расширением *.sh). Чтобы осуществить эту операцию, нужно передать xargs вывод команды find, и к файлам с указанным расширением будет применена команда -rm:
Отметим, что операцию удаления файлов можно осуществить и без xargs, а с помощью команды
Описанный способ не сработает, если в имени одного из удаляемых файлов содержится пробел. Имя, состоящее из двух слов, разделенных пробелом, не будет воспринято как единое целое.
Проиллюстрируем это следующим примером:
Как видим, файл, в имени которого имеется пробел, не был удалён.
Чтобы решить эту проблему, используется опция print0 для команды find и опция -0 для команды xargs. Она заменяет стандартный разделитель (перенос строки на нуль-символ (\x0), который и означает конец хранимой строки:
Xargs может также помочь, например, быстро удалить все временные файлы, имеющие расширение tmp:
Сжатие файлов
Сжать все файлы в текущей директории с помощью gzip можно, введя следующую команду:
Рассмотрим еще один пример: сжатие с помощью tar всех файлов с расширением *.pl:
Переименование файлов
С помощью xargs можно осуществлять массовое переименование файлов. Представим себе, что у нас есть группа файлов с расширением *.txt, и нам нужно заменить это расширение на *.sql. Это можно сделать при помощи xargs и потокового текстового редактора sed:
В результате ее выполнения на консоль будет выведен список переименованных файлов.
С помощью xargs можно также добавлять к дополнительные элементы к именам файлов (например, дату):
Вместо <..> можно подставить всё, что угодно.
Фигурные скобки {} в этом примере означают «текущий аргумент» (т.е. текущее имя файла).
Изменение прав для папок и файлов
С помощью xargs можно также ускорить процесс смены прав на файлы и папки для определенного пользователя или группы. Предположим, нам нужно найти все папки пользователя root и заменить их владельца на temp. Эта операция осуществляется при помощи команды:
Чтобы найти все папки группы root и заменить группу на temp, используется команда:
Xargs и find: сложные операции
С помощью команд find и xargs можно выполнять и более сложные операции. Вот так, например, можно удалить временные файлы, созданные более 7 дней назад:
А вот так — принудительно остановить процессы, которые уже работают больше 7 дней:
Xargs и сut
Xargs довольно часто используется в сочетании с командой cut, позволяющей вырезать строки из текстовых файлов. Рассмотрим некоторые практические примеры. С помощью приведённой ниже команды на консоль будет выведен список всех пользователей системы:
А команда вида
будет последовательно открывать файлы для редактирования в vim.
Обратим внимание на опцию -p. Благодаря ей команда будет выполняться в интерактивном режиме: перед открытием каждого файла будет запрашиваться подтверждение (y/n).
В заключение приведём ещё один сложный и интересный пример — рекурсивный поиск файлов самого большого размера в некоторой директории:
Параллельный запуск процессов
Xargs часто используется для параллельного запуска нескольких процессов. Вот так, например, можно одновременно cжать несколько директорий в tar.gz:
В приведенном примере используется ключ -P. Он указывает максимальное количество процессов, которые будут выполняться одновременно. Предположим, что у нас на входе имеется 10 аргументов. Если мы введём команду xargs с ключoм -P 3, то будет запущено 3 экземпляра команды, следующей после xargs, с каждым из этих аргументов.
С помощью xargs можно также параллельно загружать из Интернета множество файлов:
В приведенном примере с указанного адреса будут скачаны все графические файлы с расширением jpg; ключ -P указывает, что требуется скачивать по 10 файлов одновременно.
Предварительные итоги
Подведём предварительные итоги и сформулируем несколько правил работы с xargs.
- Xargs не работает с файлами, в имени которых присутствует пробел. Для решения этой проблемы с командой xargs используется опция −0. Пробел в имени файла можно обойти также следующим образом:
- Команда xargs принимает команды из со стандартного ввода, разделенные пробелом или переводом строки. Чтобы группировать эти команды, можно использовать двойные или одинарные кавычки. Можно также указать разделитель с помощью опции -d;
- Если команде xargs не передать вообще никаких аргументов, то по умолчанию будет выполнена команда /bin/echo;
- Во многих случаях команду xargs можно заменить циклом for. Например, команда
полностью эквивалента циклу
Нетривиальные примеры
Основы мы вспомнили, типичные варианты использования рассмотрели… Перейдем теперь к более сложным и нетривиальным примерам. До некоторых из них мы додумались самостоятельно, работая над повседневными задачами, а некоторые — почерпнули с сайта http://www.commandlinefu.com (всем желающим научиться тонкостям работы с командной строкой очень рекомендуем время от времени его посещать — там порой можно найти очень полезные советы).
Баним IP-адреса из списка
Чтобы забанить IP-адреса из списка, нужно их добавить в IP tables c правилом DROP. Эта операция осуществляется при помощи команды:
Можно проделать и более сложную операцию и забанить все адреса по AS:
Изменяем формат URL
Преобразовать URL вида «http%3A%2F%2Fwww.google.com» в «www,google.com» можно при помощи команды:
Генерируем пароль из 10 символов
Сгенерировать надежный пароль можно при помощи команды вида:
Генерировать пароли можно и без помощи xargs: для этого cуществует специализированная утилита pwgen. Некоторые другие способы генерации паролей описаны также здесь.
Ищем бинарные файлы, установленные без использования dpkg
Такая операция может потребоваться в случае, если, например, машина стала жертвой хакерской атаки и на ней было установлено вредоносное программное обеспечение. Выявить, что за программы поставили злоумышленники, поможет следующая команда (она ищет запущенные «бинарники», установленные без использования менеджера пакетов dpkg):
Удаляем устаревшие пакеты ядра
Проблема удаления старых ядер уже обсуждалась на Хабре — см. здесь (по этой же ссылке можно найти любопытные примеры команд).
Преобразуем скрипт в строку
Иногда возникает необходимость преобразовать большой скрипт в одну строку. Сделать это можно так:
Заключение
Как видно из проделанного обзора, возможности xargs гораздо шире, чем это может показаться на первый взгляд. Надеемся, что приведённые в статье примеры окажутся для вас полезными. Если вам известны другие интересные варианты использования xargs — добро пожаловать в комментарии.
Источник:habrahabr.ru
Комментариев нет:
Отправить комментарий