Как да конструирате необходимата команда с помощта на xargs. Разбиране на xargs. GNU паралел и xargs. Изпълнение на множество копия на команда паралелно с различни аргументи

Преглеждания: 717

Много е писано за помощната програма xargs - какво друго можете да напишете? Но ако, както се казва, копаем по-дълбоко, се оказва, че в много публикации са изложени само основите, но основното липсва: не обяснява как xargs могат да се използват в реалната практика. За съжаление има много малко статии за анализ на сложни и нетривиални приложения на този много полезен инструмент за системния администратор. Ето защо написахме нашата статия и се опитахме да включим възможно най-много примери за използване на xargs за решаване на различни проблеми.

Първо ще разгледаме принципа на xargs и ще анализираме по-прости примери, а след това ще преминем към анализа на сложни и интересни случаи.

Припомняне на основите

Как работи xargs може да се опише по следния начин: програма взема данни от стандартен вход или от файл, разделя ги според посочените параметри и след това ги предава на друга програма като аргумент.

Като цяло синтаксисът на командата xargs може да бъде представен по следния начин:

[списък_генератор_команди] | xargs [xargs_options] [команда]

Нека разгледаме как работи всичко, въз основа на материала от прости и учебни примери.

Изтриване на файлове

Една от най-често срещаните ситуации, в които се използва xargs, е изтриването на файлове, намерени с командата find.

Представете си следната ситуация: имате директория, която съдържа голям брой файлове. От него трябва да изтриете файлове от определен тип (в нашия пример файлове с разширение * .sh). За да извършите тази операция, трябва да предадете изхода на командата find на xargs и командата -rm ще бъде приложена към файлове с посоченото разширение:

$ ls
one.sh one.py two.sh two.py

$ ls
one.py two.py

Имайте предвид, че операцията по изтриване на файлове може да се извърши без xargs и с помощта на командата

$ намерете. -име "* .sh" -exec rm -rf "()"

Описаният метод няма да работи, ако името на един от файловете, които трябва да бъдат изтрити, съдържа интервал. Име, състоящо се от две думи, разделени с интервал, няма да се възприема като цяло.

Нека илюстрираме това със следния пример:

$ ls
нов файл.sh one.sh one.py two.sh two.py

$ намерете. -име "* .sh" | xargs rm -rf

$ ls
нов файл.sh one.py two.py

Както можете да видите, файлът с интервал в името му не е изтрит.

За да разрешите този проблем, използвайте опцията print0 за командата find и опцията -0 за командата xargs. Той замества стандартния разделител (прекъсване на ред с нулев знак (x0), което означава края на съхранения низ:

$ намерете. -име "* .sh" -print0 | xargs -0 rm -rf

Xargs също може да помогне, например, бързо да изтриете всички временни файлове, които имат разширение tmp:

$ find / tmp -name "* .tmp" | xargs rm

Компресиране на файлове

Можете да gzipвате всички файлове в текущата директория, като въведете следната команда:

$ ls | xargs -p -l gzip

Да вземем друг пример: компресиране на всички файлове с разширение * .pl с помощта на tar:

$ намерете. -име "* .pl" | xargs tar -zcf pl.tar.gz

Преименуване на файлове

С xargs можете групово да преименувате файлове. Нека си представим, че имаме група файлове с разширение * .txt и трябва да заменим това разширение с * .sql. Това може да стане с xargs и потоковия текстов редактор sed:

$ ls | sed -e "p; s / .txt $ /. sql /" | xargs -n2 fmv

В резултат на неговото изпълнение на конзолата ще се покаже списък с преименувани файлове.

С xargs можете също да добавите допълнителни елементи към имената на файлове (например дата):

$ ls | xargs -I ФАЙЛ mv () - ()

Вместо това можете да замените всичко, което искате.
Къдравите скоби () в този пример означават "текущ аргумент" (тоест текущото име на файл).

Промяна на разрешенията за папки и файлове

Можете също да използвате xargs, за да ускорите процеса на промяна на разрешенията за файлове и папки за конкретен потребител или група. Да кажем, че трябва да намерим всички папки за root и да сменим собственика им с temp. Тази операция се извършва с помощта на командата:

$ намерете. -group root -print | xargs chown temp

За да намерите всички папки в основната група и да замените групата с temp, използвайте командата:

$ намерете. -group root -print | xargs chgrp темп

Xargs и find: сложни операции

По-сложните операции могат да се извършват с помощта на командите find и xargs. Ето как например можете да изтриете временни файлове, създадени преди повече от 7 дни:

$ find / tmp -type f -name "*" -mtime +7 -print0 | xargs -0 rm -f

И така - принудително спиране на процеси, които вече работят повече от 7 дни:

$ find / proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename (); | xargs убиват -9

Xargs и изрежете

Xargs често се използва във връзка с командата cut за изрязване на редове от текстови файлове. Нека разгледаме някои практически примери. С помощта на командата по-долу, на конзолата ще се покаже списък с всички потребители в системата:

$ изрязване -d: -f1

И команда като

файл * | grep ASCII | изрязване -d ":" -f1 | xargs -p vim

ще отваря файлове последователно за редактиране във vim.
Обърнете внимание на опцията -p. Благодарение на него командата ще се изпълнява интерактивно: преди отваряне на всеки файл ще бъде поискано потвърждение (y / n).

В заключение ще дадем един по-сложен и интересен пример - рекурсивно търсене на файлове с най-голям размер в определена директория:

$ намерете. -type f -printf "s% pn" | сортиране -n | изрежете -b22- | tr "n" "

xargs- помощна програма за формиране на списък с аргументи и изпълнение на команди. Тоест, xargs ви позволява да извикате всяка команда с аргументи. Командата xargs има два компонента. Първо, трябва да посочите файловете, които ви интересуват. Второ, трябва да посочите командата или скрипта, който искате да приложите към всеки от тези файлове.

xargs - разделя входния поток на аргументи и предава изпълнението им на всяка команда (ехо по подразбиране). Чете от стандартен вход или от тръба.

Режими на обработка на xargs на входящи данни

    По подразбиране всеки символ на интервал се счита за разделител на аргумента: интервал, табулатор, вертикален табулатор или преместване на ред. Но както при обвивката, можете да използвате "" или \, за да предотвратите разделянето на аргументите.

    Режимът, активиран от параметъра -L. Почти идентичен с предишния, с изключение на това, че xargs помни кой аргумент е на кой ред. Освен това, ако ред завършва с интервал или табулатор, следващият ред се счита за продължение на текущия.

    Ред по ред. Включено при използване на опцията -I или -0. В този случай целият ред се счита за един целочислен аргумент, въпреки интервалите и табулациите вътре. За -I краят на реда е "\ n", а за -0 символът "\ 0"

    Пример: Търсене / home / user1 за всички файлове с имена, завършващи на ".txt" и копирането им в друга директория. find / home / user1 -name "* .txt" | xargs cp -av --target-directory = / home / backup / --parents

    Намерете появата на фразата за влизане начало във всички файлове, разположени в директорията / etc / samba. $ find / etc / samba | xargs grep -ni "вход в дома"

    Изтриване на списък с файлове. Пътищата до файла се записват ред по ред във файла delfiles.txt xargs rm< delfiles.txt

Много е писано за помощната програма xargs - какво друго можете да напишете? Но ако, както се казва, копаем по-дълбоко, се оказва, че в много публикации са изложени само основите, но основното липсва: не обяснява как xargs могат да се използват в реалната практика. За съжаление има много малко статии за анализ на сложни и нетривиални приложения на този много полезен инструмент за системния администратор. Ето защо написахме нашата статия и се опитахме да включим възможно най-много примери за използване на xargs за решаване на различни проблеми.

Първо ще разгледаме принципа на xargs и ще анализираме по-прости примери, а след това ще преминем към анализа на сложни и интересни случаи.

Припомняне на основите

Как работи xargs може да се опише по следния начин: програма взема данни от стандартен вход или от файл, разделя ги според посочените параметри и след това ги предава на друга програма като аргумент.

Като цяло синтаксисът на командата xargs може да бъде представен по следния начин:

[списък_генератор_команди] | xargs [xargs_options] [команда]
Нека разгледаме как работи всичко, въз основа на материала от прости и учебни примери.

Изтриване на файлове

Една от най-често срещаните ситуации, в които се използва xargs, е изтриването на файлове, намерени с командата find.

Представете си следната ситуация: имате директория, която съдържа голям брой файлове. От него трябва да изтриете файлове от определен тип (в нашия пример файлове с разширение * .sh). За да извършите тази операция, трябва да предадете изхода на командата find на xargs и командата -rm ще бъде приложена към файлове с посоченото разширение:

$ ls one.sh one.py two.sh two.py $ find. -име "* .sh" | xargs rm -rf $ ls one.py two.py

Имайте предвид, че операцията по изтриване на файлове може да се извърши без xargs и с помощта на командата

$ намерете. -име "* .sh" -exec rm -rf "()" \

Описаният метод няма да работи, ако името на един от файловете, които трябва да бъдат изтрити, съдържа интервал. Име, състоящо се от две думи, разделени с интервал, няма да се възприема като цяло.

Нека илюстрираме това със следния пример:

$ ls new file.sh one.sh one.py two.sh two.py $ find. -име "* .sh" | xargs rm -rf $ ls нов файл.sh one.py two.py

Както можете да видите, файлът с интервал в името му не е изтрит.

За да разрешите този проблем, използвайте опцията print0 за командата find и опцията -0 за командата xargs. Той замества стандартния разделител (подаване на ред с нулев знак (\ x0), което означава края на съхранения низ:

$ намерете. -име "* .sh" -print0 | xargs -0 rm -rf

Xargs също може да помогне, например, бързо да изтриете всички временни файлове, които имат разширение tmp:

$ find / tmp -name "* .tmp" | xargs rm

Компресиране на файлове

Можете да gzipвате всички файлове в текущата директория, като въведете следната команда:

$ ls | xargs -p -l gzip

Да вземем друг пример: компресиране на всички файлове с разширение * .pl с помощта на tar:

$ намерете. -име "* .pl" | xargs tar -zcf pl.tar.gz

Преименуване на файлове

С xargs можете групово да преименувате файлове. Нека си представим, че имаме група файлове с разширение * .txt и трябва да заменим това разширение с * .sql. Това може да стане с xargs и потоковия текстов редактор sed:

$ ls | sed -e "p; s / .txt $ /. sql /" | xargs -n2 fmv

В резултат на неговото изпълнение на конзолата ще се покаже списък с преименувани файлове.

С xargs можете също да добавите допълнителни елементи към имената на файлове (например дата):

$ ls | xargs -I ФАЙЛ mv ()<...>-{}

Вместо<..>можете да замените всичко, което искате.
Къдравите скоби () в този пример означават "текущ аргумент" (тоест текущото име на файл).

Промяна на разрешенията за папки и файлове

Можете също да използвате xargs, за да ускорите процеса на промяна на разрешенията за файлове и папки за конкретен потребител или група. Да кажем, че трябва да намерим всички папки за root и да сменим собственика им с temp. Тази операция се извършва с помощта на командата:

$ намерете. -group root -print | xargs chown temp

За да намерите всички папки в основната група и да замените групата с temp, използвайте командата:

$ намерете. -group root -print | xargs chgrp темп

Xargs и find: сложни операции

По-сложните операции могат да се извършват с помощта на командите find и xargs. Ето как например можете да изтриете временни файлове, създадени преди повече от 7 дни:

$ find / tmp -type f -name "*" -mtime +7 -print0 | xargs -0 rm -f

И така - спирайте принудително процеси, които вече работят повече от 7 дни:

$ find / proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename () \; | xargs убиват -9

Xargs и изрежете

Xargs често се използва във връзка с командата cut за изрязване на редове от текстови файлове. Нека разгледаме някои практически примери. С помощта на командата по-долу, на конзолата ще се покаже списък с всички потребители в системата:

$ изрязване -d: -f1< /etc/passwd | sort | xargs echo

И команда като

Файл * | grep ASCII | изрязване -d ":" -f1 | xargs -p vim
ще отваря файловете последователно за редактиране във vim.
Обърнете внимание на опцията -p. Благодарение на него командата ще се изпълнява интерактивно: преди отваряне на всеки файл ще бъде поискано потвърждение (y / n).

В заключение ще дадем един по-сложен и интересен пример - рекурсивно търсене на файлове с най-голям размер в определена директория:

$ намерете. -type f -printf "% 20s% p \ n" | сортиране -n | изрежете -b22- | tr "\ n" "\ 000" | xargs -0 ls -laSr

Паралелно стартиране на процеси

Xargs често се използва за паралелно стартиране на множество процеси. Ето как, например, можете да компресирате няколко директории едновременно в tar.gz:

$ echo dir1 dir2 dir3 | xargs -P 3 -I ИМЕ tar czf ИМЕ.tar.gz ИМЕ

Този пример използва превключвателя -P. Показва максималния брой процеси, които ще се изпълняват едновременно. Да предположим, че имаме 10 аргумента като вход. Ако издадем командата xargs с превключвателя -P 3, тогава ще бъдат изпълнени 3 екземпляра на командата, следваща xargs, с всеки от тези аргументи.

Можете също така да изтеглите много файлове паралелно от интернет с помощта на xargs:

В дадения пример всички графични файлове с разширение jpg ще бъдат изтеглени от посочения адрес; превключвателят -P показва, че искате да изтеглите 10 файла наведнъж.

Предварителни резултати

Нека обобщим предварителните резултати и да формулираме няколко правила за работа с xargs.

  1. Xargs не работи с файлове, които имат интервал в имената си. Опцията -0 се използва за разрешаване на този проблем с командата xargs. Пространството в името на файла може също да бъде заобиколено, както следва:
    $ xargs -I FILE my_command “FILE”
  2. Командата xargs приема команди от стандартен вход, разделени с интервали или нови редове. Можете да използвате двойни или единични кавички, за да групирате тези команди. Можете също да посочите разделител, като използвате опцията -d;
  3. Ако на командата xargs изобщо не се предават аргументи, по подразбиране е / bin / echo;
  4. В много случаи командата xargs може да бъде заменена с цикъл for. Например командата
    $ намерете. -type f -и -iname "* .deb" | xargs -n 1 dpkg -I
    напълно еквивалентен на цикъл
    $ за файл в `find. -type f -и -iname "* .deb" `; do dpkg -I "$ файл"; Свършен

Нетривиални примери

Спомнихме си основите, разгледахме типични случаи на употреба... Сега нека преминем към по-сложни и нетривиални примери. За някои от тях се сетихме сами, работейки по ежедневни задачи, а някои от тях бяха взети от сайта http://www.commandlinefu.com полезни съвети).

Забрана на IP адреси от списъка

За да забраните IP адресите от списъка, трябва да ги добавите към IP таблици с правилото DROP. Тази операция се извършва с помощта на командата:

$ котка bad_ip_list | xargs -I IP iptables -A INPUT -s IP -j DROP
Можете да направите по-сложна операция и да забраните всички адреси чрез AS:

$ / usr / bin / whois -H -h whois.ripe.net -T route -i origin AS<номер>| egrep "^ маршрут" | awk "(отпечатване $ 2)" | xargs -I NET iptables -A INPUT -s NET -j DROP

Промяна на формата на URL

Можете да преобразувате URL като "http% 3A% 2F% 2Fwww.google.com" в "www, google.com", като използвате командата:

Echo "http% 3A% 2F% 2Fwww.google.com" | sed -e "s /% \ (\) / \\\\\ x \ 1 / g" | xargs echo -e

Генериране на парола от 10 знака

Можете да генерирате силна парола, като използвате команда от формата:

$ tr -dc A-Za-z0-9_< /dev/urandom | head -c 10 | xargs

Можете да генерирате пароли без помощта на xargs: за това има специализирана помощна програма pwgen. Описани са и някои други начини за генериране на пароли.

Търся инсталирани двоични файлове без използване на dpkg

Такава операция може да се наложи, ако например машина е станала жертва на хакерска атака и на нея е инсталиран злонамерен софтуер. Следната команда ще ви помогне да определите какви програми са инсталирали нападателите (тя търси инсталирани "двоични файлове", без да се използва мениджърът на пакети dpkg):

$ сat /var/lib/dpkg/info/*.list> / tmp / listin; ls / proc / * / exe | xargs -l връзка за четене | grep -xvFf / tmp / listin; rm / tmp / listin

Премахване на остарели пакети на ядрото

$ dpkg -l linux- * | awk "/ ^ ii / (отпечатване $ 2)" | grep -v -e `uname -r | cut -f1,2 -d "-" `| grep -e | xargs sudo apt-get -y purge

Проблемът с премахването на стари ядра вече беше обсъден на Habré - вижте (на същата връзка можете да намерите любопитни примери за команди).

Преобразувайте скрипта в низ

Понякога става необходимо да конвертирате голям скрипт в един ред. Можете да го направите по следния начин: Добавете тагове

Наскоро бях вдъхновен да напиша тази публикация, след като попаднах на ситуации, в които трябваше да редактирам няколко файла от проект и да заменя някои думи с други. Преди го правех през Notepad ++(CTRL + H), но е добре, ако знаем в кой файл трябва да заменим думата и дали има хиляди такива файлове. Затова искам да ви представя 3 основни инструмента на системата UNIXднес: grep, xargs, и sed.

Може да сте ги чували преди и вече знаете как да ги използвате, но със сигурност няма да научите нищо ново. Но ако искате да научите основите на използването на тези инструменти, прочетете нататък.

Grep

Grep е командна база на Unix за търсене на фрази както от стандартния поток, така и от файлове. Grep връща информация за файловете, които съдържат вашата фраза и известна информация за това къде се намират. Ето пример за стандартен начин за използване на Grep:

Grep "footer" index.html

Сега нека добавим някои опции за търсене:

  • и- Пренебрегва регистъра за сравнения.
  • н- Пред всеки ред дава номера във файла.
  • б- Дава номера на колоната в намерения файл.
grep -i -n -b "долен колонтитул" index.html

Сега потърсете цели думи:

  • w- Търси цели думи. Например при нормално търсене на низа text grep може да намери думата textarea... И ако се използва този ключ, тогава ще бъдат намерени само редове с текст на думата.
grep -w "текст" index.html

Търсенето във файл е добре, но е по-добре, ако можем да търсим файлове рекурсивно в целия проект.

  • r- Рекурсивно търсене на файлове от текущата директория.
  • л- Връща само имена на файлове, съдържащи желаната стойност.
grep -r -l "долен колонтитул" ./

Сега нека се опитаме да покажем файлове, които не съдържат желаната стойност.

  • Л- Показва имената на файлове, които нямат желаната стойност.
grep -r -L -i "долен колонтитул" ./

Също така много често трябва да търсим дадена стойност в конкретни типове файлове.

  • – Включва = "ШАБЛЕН"- Търсене във файлове за даден шаблон
grep -r --include = "*. html" -l "долен колонтитул" ./

Търсете файлове, които започват с индекс и завършват с .php

Grep -r --include = "index * .php" -l "footer" ./

Сега нека прехвърлим резултата от нашата работа във файл.

Grep -r -l "долен колонтитул" ./> out.txt

Xargs

Тази невероятна команда работи върху трейлър, взема данни от стандартен вход или от файл, разделя ги според посочените параметри и след това ги предава на друга програма като аргумент. Xargs се изпълнява, докато данните от потока не се изчерпят. Сега нека да разгледаме няколко прости примера.

Разбийте стандартния поток на аргументи.

  • - Посочваме броя на върнатите аргументи.
ехо 1 2 3 4 | xargs -n 1

Сега нека зададем разделителя на аргументите.

  • - Указва разделител за показване на аргументи.
ехо "1-2-3-4" | xargs -d "-" -n 1

Ето по-интересен пример, когато xargs се използва за прехвърляне на файлове, които да бъдат изтрити.

Намирам. -име "* .txt" | xargs rm -rf

Целият смисъл на използването на xargs е да се разделят входните аргументи, така че да могат да бъдат предадени на други програми.

Sed

Sed е стрийминг редактор, който взема текст от стандартен поток или текстов файл, изпълнява някои операции върху редовете и след това отпечатва резултата в стандартен изход или във файл. Обикновено в скриптовете, sed се използва в конвейера, заедно с други команди и помощни програми.

Правим проста подмяна на редове от файла text.txt и го запазваме във файла out.txt.

Sed "s / text / test / g" text.txt> out.txt

Сега нека запишем всички промени в текущия файл.

  • и- за записване на промени в текущия файл.
sed -i "s / текст / тест / g" text.txt

Комбиниране на всичко заедно

Чрез комбиниране на тези три команди, които са общи за всички unix системи, можем да направим доста мощен скрипт за подмяна на текст. Повечето от действията идват от използването на командата sed, но други команди са полезни за изграждане на заявката. Сега нека разгледаме пример за използване на трите програми за почистване:

Grep -r -l "foo" ./ | xargs sed -i "s / foo / bar / g"

Така успяхме да заменим всичко fooНа барс помощта на проста комбинация от тези програми.

Сега, когато научихме основите на това как работят страхотни инструменти като grep, xargs и sed. Ще можем да пишем по-усъвършенствани скриптове за нашите задачи.


Автор: Джошуа Рийд
Дата на публикуване: 25 септември 2014 г
Превод: А. Кривошей
Дата на прехвърляне: април 2015 г

Изпадали ли сте някога в ситуация, в която трябва да изпълнявате една и съща команда много пъти подред? Ако е така, тогава разбирате колко е скучно и неефективно. И добрата новина е, че Unix-базираните операционни системи имат страхотна команда xargs за решаване на този проблем.С тази команда можете да работите много ефективно с голям брой файлове, спестявайки ви време и караница. В тази статия ще видите как се прави това.
Командата xargs има два компонента. Първо, трябва да посочите файловете, които ви интересуват. Второ, трябва да посочите командата или скрипта, който искате да приложите към всеки от тези файлове.
В този урок ще разгледаме три сценария за използване на командата xargs за обработка на файлове, разположени в няколко различни директории:

1. Преброяване на броя на редовете във всички файлове.
2. Изведете първия ред от посочените файлове.
3. Обработка на всеки файл с помощта на посочения скрипт.

Помислете за директория с име xargstest (дървото на директорията може да бъде показано с помощта на командата tree с опциите -i и -f, които показват резултатите без отстъп и с пълния префикс на пътя за всеки файл):

$ дърво -ако xargstest /

Директорията xargstest, нейните поддиректории и файлове ще бъдат използвани по-нататък в нашите примери.

Сценарий 1: Преброяване на броя на редовете във всички файлове

Както беше посочено по-рано, първият компонент на командата xargs е списъкът с файлове, с които командата работи. Можете да използвате командата find, за да идентифицирате тези файлове и да ги изброите. Опция -име "файл ??" показва, че се интересуваме само от файлове, чието име започва с "файл", след което има още два знака в името. Търсенето се извършва в директорията xargstest и търсенето се извършва рекурсивно, тоест във всички поддиректории на xargstest (ако има такива).

$ намери xargstest / -име "файл ??" xargstest / dir3 / file3B xargstest / dir3 / file3A xargstest / dir1 / file1A xargstest / dir1 / file1B xargstest / dir2 / file2B xargstest / dir2 / file2A

Можем да пренасочим резултатите от търсенето към командата за сортиране, за да сортираме по име:

$ намери xargstest / -име "файл ??" | сортиране на xargstest / dir1 / file1A xargstest / dir1 / file1B xargstest / dir2 / file2A xargstest / dir2 / file2B xargstest / dir3 / file3A xargstest / dir3 / file3B

Сега имаме нужда от втори компонент, който е командата, която искаме да изпълним. За да преброим броя на редовете във всеки файл, ще използваме командата wc с опцията -l (броят на редовете се показва в началото на всеки изходен ред):

$ намери xargstest / -име "файл ??" | сортиране | xargs wc -l 1 xargstest / dir1 / file1A 2 xargstest / dir1 / file1B 3 xargstest / dir2 / file2A 4 xargstest / dir2 / file2B 5 xargstest / dir3 / file3A 6 xargstest / dir3 / file3B 21 общо

Можете да видите, че вместо ръчно да изпълнявате командата wc -l на всеки от тези файлове, xargs ви позволява да извършите тази операция с една команда. Можете лесно да извършвате различни операции със стотици файлове.

Сценарий 2: извеждане на първия ред на всеки даден файл

Сега, когато имате общо разбиране за това как да използвате командата xargs, имате пълна свобода при избора коя команда да изпълните. Понякога може да се наложи да обработите само избрани файлове, но не всички, намиращи се в дадена директория. В този случай трябва да използвате командата find с опцията -name, за да изберете необходимите файлове и да ги пренасочите към командата xargs. Например, ако искате да отпечатате първия ред от всички файлове, които завършват на "B", използвайте следната комбинация от find, xargs и head (head -n1 отпечатва първия ред на файла):

$ намери xargstest / -име "файл? B" | сортиране | глава на xargs -n1 ==> xargstest / dir1 / file1B<== one ==>xargstest / dir2 / file2B<== one ==>xargstest / dir3 / file3B<== one

Можете да видите, че се обработват само файлове, чието име завършва на "B", останалите се игнорират.

Сценарий 3: Обработка на всеки файл със скрипт

И накрая, можете да имате свой собствен скрипт (написан на Bash, Python или Perl, например) за обработка на файловете. Просто заменете името му с командите wc и head в предишния пример.

$ намери xargstest / -име "файл ??" | xargs myscript.sh

Скриптът myscript.sh трябва да бъде написан така, че да приеме име на файл като аргумент и да обработи този файл. Горната команда ще приложи този скрипт към всеки файл, намерен от командата find.

Имайте предвид, че в горните примери имената на файлове не съдържат интервали. Като цяло можете да кажете, че животът в Linux е много по-приятен, ако не използвате интервали в имената на файлове. Ако трябва да обработите файлове, чиито имена включват интервали, горната команда няма да работи. Тя трябва да бъде променена малко, като добавите опцията "-print0" към командата find (която отпечатва пълното име, последвано от нулев знак към stdout) и опцията -0 към командата xargs (която интерпретира нулевия знак в край на реда), както е показано по-долу:

$ намери xargstest / -име "файл *" -print0 | xargs -0 myscript.sh

Обърнете внимание, че аргументът за опцията -name е променен на "file *", което означава всички файлове с имена, започващи с "file" и завършващи с всякакви знаци.

Заключение

След като прочетете този урок, ще знаете възможностите на командата xargs и как можете да ги използвате в работата си. Скоро ще прекарвате много по-малко време за повтарящи се задачи. Ако искате да знаете за всички опции и възможности на командата xargs, просто въведете терминал.