Команда Xargs

Thank you for reading this post, don't forget to subscribe!

Утили­та xargs поз­во­ля­ет созда­вать и выпол­нять коман­ды из стан­дарт­но­го ввода.

Xargs обыч­но исполь­зу­ет­ся в соче­та­нии с дру­ги­ми коман­да­ми через кон­вей­ер. Исполь­зо­ва­ние xargs поз­во­ля­ет вам предо­став­лять стан­дарт­ный ввод в каче­стве аргу­мен­тов ути­лит команд­ной стро­ки, таких как mkdir и rm.

В этой ста­тье мы рас­смот­рим осно­вы исполь­зо­ва­ния коман­ды xargs.

 

Xargs чита­ет аргу­мен­ты из стан­дарт­но­го вво­да, раз­де­лен­ные про­бе­ла­ми или сим­во­ла­ми новой стро­ки, и выпол­ня­ет ука­зан­ную коман­ду, исполь­зуя вход­ные дан­ные в каче­стве аргу­мен­тов коман­ды. Если коман­да не ука­за­на, по умол­ча­нию исполь­зу­ет­ся /bin/echo.

Син­так­сис коман­ды xargs следующий:

Самый про­стой при­мер исполь­зо­ва­ния xargs – пере­дать несколь­ко строк, раз­де­лен­ных про­бе­ла­ми, с помо­щью кана­ла в xargs и запу­стить коман­ду, кото­рая будет исполь­зо­вать эти стро­ки в каче­стве аргументов.

В при­ве­ден­ном выше при­ме­ре мы пере­да­ем стан­дарт­ный ввод в xargs, и коман­да touch запус­ка­ет­ся для каж­до­го аргу­мен­та, созда­вая три фай­ла. Это так же, как если бы вы запустили:

Что­бы напе­ча­тать коман­ду на тер­ми­на­ле перед ее выпол­не­ни­ем, исполь­зуй­те опцию -t( –verbose):

Если вы хоти­те полу­чить под­сказ­ку, сле­ду­ет ли запус­кать каж­дую коман­ду перед ее выпол­не­ни­ем, исполь­зуй­те пара­метр -p( –interactive):

Вве­ди­те y или Y под­твер­ди­те и выпол­ни­те команду:

Этот пере­клю­ча­тель поле­зен при выпол­не­нии деструк­тив­ных команд.

 

По умол­ча­нию коли­че­ство аргу­мен­тов, пере­да­ва­е­мых коман­де, опре­де­ля­ет­ся систем­ным пределом.

Опция -n( –max-args) ука­зы­ва­ет коли­че­ство аргу­мен­тов, пере­да­ва­е­мых дан­ной коман­де. Xargs будет запус­кать ука­зан­ную коман­ду столь­ко раз, сколь­ко потре­бу­ет­ся, пока все аргу­мен­ты не будут исчерпаны.

В сле­ду­ю­щем при­ме­ре коли­че­ство аргу­мен­тов, счи­ты­ва­е­мых из стан­дарт­но­го вво­да, огра­ни­че­но 1.

Как вы може­те видеть из подроб­но­го выво­да ниже, сен­сор­ная коман­да выпол­ня­ет­ся отдель­но для каж­до­го аргумента:

Что­бы запу­стить несколь­ко команд с 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-адрес.

ips.txt

Мы так­же исполь­зу­ем опцию -L, кото­рая инструк­ти­ру­ет xargs читать по одной стро­ке за раз. Если эта опция не ука­за­на, xargs пере­да­ет все IP-адре­са одной коман­де ping.

xargs чаще все­го исполь­зу­ет­ся в соче­та­нии с коман­дой find. Вы може­те исполь­зо­вать find для поис­ка опре­де­лен­ных фай­лов, а затем исполь­зо­вать xargs для выпол­не­ния опе­ра­ций с эти­ми файлами.

Что­бы избе­жать про­блем с име­на­ми фай­лов, кото­рые содер­жат сим­во­лы новой стро­ки или дру­гие спе­ци­аль­ные сим­во­лы, все­гда исполь­зуй­те пара­метр поис­ка, -print0 кото­рый заста­вит find печа­тать пол­ное имя фай­ла, за кото­рым сле­ду­ет нуле­вой сим­вол. Этот вывод мож­но пра­виль­но интер­пре­ти­ро­вать с помо­щью xargs, исполь­зуя опцию -0, ( –null).

В сле­ду­ю­щем при­ме­ре коман­да find рас­пе­ча­та­ет пол­ные име­на всех фай­лов в ката­ло­ге /var/www/.cache, а xargs пере­даст пути к фай­лам коман­де rm:

Xargs так­же мож­но исполь­зо­вать как инстру­мент для уда­ле­ния про­бе­лов с обе­их сто­рон задан­ной стро­ки. Про­сто пере­дай­те стро­ку в коман­ду xargs, и она выпол­нит обрезку:

Это может быть полез­но при срав­не­нии строк в сце­на­ри­ях оболочки.