GNU/Linux >> Znalost Linux >  >> Linux

8 Praktické příklady příkazu Linux Xargs pro začátečníky

Linux xargs command nemusí být příliš oblíbeným nástrojem příkazového řádku, ale to nebere skutečnost, že je extrémně užitečný, zvláště v kombinaci s jinými příkazy, jako je najít a grep . Pokud jste s xargs noví a chcete porozumět jeho použití, budete rádi, když budete vědět, že přesně to zde budeme dělat.

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.

1. Jak funguje příkaz Xargs?

Než se pustíte do jeho použití, je důležité pochopit, co přesně Xargs dělá. Laicky řečeno, nástroj - ve své nejzákladnější podobě - ​​čte data ze standardního vstupu (stdin) a na základě přečteného vstupu jednou nebo vícekrát provede příkaz (jemu dodaný jako argument). Jakékoli mezery a mezery ve vstupu jsou považovány za oddělovače, zatímco prázdné řádky jsou ignorovány.

Pokud není do xargs zadán žádný příkaz, výchozí příkaz, který nástroj provede, je echo . Například v následujícím příkladu jsem právě provedl 'xargs' a zadal 'Hello World' na stdin. Když jsem stiskl Ctrl+D (abych řekl xargs, že jsme se vstupem hotovi), echo příkaz byl automaticky proveden a znovu bylo vytištěno 'Hello World'.

2. Jak použít xargs s jiným příkazem?

Zatímco echo je výchozí příkaz, který xargs provede, můžete explicitně zadat jakýkoli jiný příkaz. Můžete například předat příkaz find spolu s jeho možností „-name“ jako argument do xargs a poté předat název souboru (nebo typ souborů), který chcete najít pro vyhledávání jako vstup přes stdin.

Zde je celý dotyčný příkaz:

xargs find -name

Například jsme zadali "*.txt" ve vstupu přes stdin, což znamená, že chceme najít příkaz k prohledání všech souborů .txt v aktuálním adresáři (a také jeho podadresářích).

Zde je příkaz v akci:

3. Jak zajistit, aby xargs provedl příkaz vícekrát (jednou pro každý vstupní řádek/argument)

V příkladu, o kterém jsme hovořili v předchozí části, jsme chtěli hledat soubory .txt, takže jsme na vstupu uvedli „*.txt“. Ale co když je požadavkem vyhledávat také jiné typy souborů, jako jsou .log a .tmp?

Zkuste je zadat jako vstup do xargs po "*.txt" a uvidíte, co se stane. Měli byste dostat chybu podobnou následující:

Je to proto, že xargs předává „*.txt“ a „*.log“ jako vstup názvu souboru do find příkaz a poté najít selže, protože běží se dvěma názvy souborů na vstupu. Spuštění příkazu find si můžete představit následujícím způsobem:

find -name "*.txt" "*.log"

A to není správný způsob.

Chceme, aby příkaz xargs nejprve předal "*.txt" do find příkaz, takže najít nám dává výsledky související se soubory .txt a pak je předán "*.log". To lze provést pomocí -L možnost příkazového řádku xargs poskytuje.

-L možnost příkazového řádku vyžaduje číslo, které považuje za maximální počet neprázdných řádků, které by měly být předány jako vstup do příkazu najednou. V našem případě tedy tato hodnota bude 1, protože chceme, aby jeden vstupní řádek byl předán jako vstup pro hledání najednou.

Zde je příkaz, který bychom měli spustit:

xargs -L 1 find -name

Následující snímek obrazovky ukazuje výše uvedený příkaz v akci:

Zatím je vše dobré. Ale co když předáte vstup následujícím způsobem:

"*.txt" "*.log"

Příkaz se nezdaří, protože '-L 1' zajistí, aby byl celý řádek předán do find příkaz.

V situacích, jako jsou tyto, můžete použít volbu příkazového řádku '-n'.

Volba příkazového řádku '-n', například '-L', vyžaduje číslo, které by představovalo počet argumentů, které má xargs předávat na příkazový řádek. V případě, o kterém jsme právě hovořili, by „*.txt“ a „*.log“ měly být různé argumenty, a protože chceme, aby byly předány jednotlivě, budeme muset zadat „1“ jako hodnotu „-n“ .

xargs -n 1 najít -jméno

Takže toto jsou způsoby, jak můžeme donutit xarg provést příkaz vícekrát.

4. Jak zajistit, aby xargs zvládal názvy souborů s mezerami

Pokud si vzpomínáte, na začátku jsme zmínili, že xargs zachází s mezerami (stejně jako se znaky nového řádku) jako s oddělovači. To může způsobit problémy v případech, kdy názvy souborů předávané jako vstup do xargs obsahují mezery.

Předpokládejme například, že aktuální adresář obsahuje soubor s názvem „new music.mp3“ a chcete, aby xargs předal tento název přehrávači mplayer aby mohl tento soubor přehrát. Pokud půjdete konvenčním způsobem, dostanete chybu:

Je to proto, že kvůli prostoru mezi 'new' a 'music.mp3' jsou tyto soubory mplayerem považovány za dva různé soubory. Jedním ze způsobů, jak tento problém vyřešit, je použít zpětné lomítko při zadávání vstupu:

new\ music.mp3

Druhým způsobem je změnit oddělovač, což můžete provést pomocí -d volba. Můžete například požádat xargs, aby jako oddělovač považoval pouze nový řádek, což lze provést následujícím způsobem:

xargs -d '\n' mplayer

5. Jak zajistit, aby xargs zpracovával názvy souborů se znaky nového řádku

Nyní tedy víme, jak můžeme zajistit, aby xargs zvládal názvy souborů, které obsahují mezery. Ale co nové řádky? Ano, názvy souborů mohou mít také znaky nového řádku. Například existuje soubor s názvem 'foo'[nový řádek]'file.txt'. Na terminálu se název zobrazí jako 'foo?file.txt'.

Nyní předpokládejme, že chci najít příkaz k vyhledání všech souborů s názvy začínajícími textem „foo“ a poté pomocí xargs tyto soubory otevřete v gedit . Zde je příkaz:

find . -name "foo*" | xargs gedit

Příkaz bohužel nesplní svůj účel, protože se v Gedit otevře nový soubor s názvem 'foo'. Je to pravděpodobně proto, že znak nového řádku je pomocí xargů považován za oddělovač.

Chcete-li tento problém vyřešit, použijte -print0 možnost, která najde nabídky a spojí ji s xarg's -0 volba. Zde je návod, jak manuálová stránka hledání vysvětluje tuto možnost:

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

Zde je příkaz, který bychom měli používat:

find . -name "foo*" -print0 | xargs -0 gedit

6. Jak najít soubory obsahující konkrétní text

Příkaz xargs se opravdu hodí, pokud chcete hledat soubory obsahující konkrétní text/řetězec. Pokud například chcete najít soubory .txt obsahující text 'abc', můžete to provést následujícím způsobem:

find -name "*.txt" | xargs grep "abc"

Zde je příkaz v akci:

Jak je zcela zřejmé, v tomto případě příkaz xargs získává svůj vstup z find příkaz.

7. Jak zajistit, aby xargs akceptoval vstup ze souboru 

Doposud jsme viděli xargs přijímající vstup ze stdin (což je výchozí chování) i z jiného příkazu (diskutovaného v minulé sekci). Pokud však chcete, můžete také nechat xargs přijímat vstup ze souboru.

-a příkazu možnost vám to umožní. Tato volba očekává název souboru - to by byl soubor, ze kterého bude xargs číst vstup.

Předpokládejme například, že existuje soubor s názvem 'input.txt'. Obsahuje vstup pro xargs (obsahem jsou v podstatě dva názvy souborů:testfile1.txt a testfile2.txt). Zde je návod, jak lze xargs použít ke čtení vstupu z tohoto souboru a jeho předání jinému příkazu, řekněme ls .

xargs -a input.txt ls -lart

Zde je příkaz v akci:

8. Jak přimět xargs, aby před provedením příkazu hledaly oprávnění uživatele

Již jsme diskutovali o tom, jak můžete dosáhnout toho, aby xargs provedl příkaz vícekrát (viz bod 3 výše). Ale co když chcete, aby xargs požádal o vaše povolení pokaždé, když spustí příkaz? Je to možné? Ano, je - -p možnost příkazového řádku to umožňuje.

Zde je příklad, jak můžete spustit xargs v interaktivním režimu:

Právě jsme zde poškrábali povrch, protože příkaz xargs poskytuje spoustu dalších funkcí ve formě možností příkazového řádku. Vyzkoušejte koncepty/funkce xargs, které jsme vysvětlili v tomto tutoriálu, a v případě jakýchkoli pochybností nebo dotazů si projděte jeho manuálovou stránku.


Linux
  1. Linux cd command tutorial pro začátečníky (8 příkladů)

  2. Linux killall příkaz pro začátečníky (8 příkladů)

  3. Příklady příkazů xargs v Linuxu

  1. 10 příkladů příkazů „rm“ pro linuxové začátečníky

  2. 10 příkladů příkazů Linux Cat pro začátečníky

  3. Výuka příkazů Linux pro začátečníky (5 příkladů)

  1. Linuxový příkaz dir pro začátečníky (10 příkladů)

  2. Příkaz Linux rm vysvětlený pro začátečníky (8 příkladů)

  3. Linux ln Command Tutorial pro začátečníky (5 příkladů)