GNU/Linux >> Znalost Linux >  >> Linux

Jak používat výkonný příkaz Xargs v Linuxu [vysvětleno s příklady]

xargs je jedním z nejvýkonnějších příkazů v Linuxu. V tomto tutoriálu vám ukážu, jak můžete xargs převést standardní vstup na příkazy.

Co je příkaz xargs?

Příkaz xargs čte řádky textu ze standardního vstupu nebo z výstupu jiného příkazu a převádí je na příkazy a provádí je.

Často zjistíte, že příkaz xargs se používá s příkazem find. Příkaz find vám poskytne seznam názvů souborů a příkaz xargs vám umožní použít tyto názvy souborů, jeden po druhém, jako by byly vstupem do druhého příkazu.

Vzhledem k tomu, že xargs funguje na přesměrování, vřele doporučuji oprášit své znalosti stdin, stdout a přesměrování potrubí v Linuxu.

Jak používat příkaz xargs?

příkaz xargs má následující syntaxi:

xargs [options] [command [initial-arguments]]

Ale asi to takhle nepoužiješ. Jeho síla spočívá v kombinování výstupu jednoho příkazu s druhým. Podívejme se na to na jednoduchém příkladu.

V mém aktuálním adresáři mám nějaké textové soubory a květiny.txt mají názvy všech těchto souborů:

[email protected]:~/tutorial$ ls
flowers.txt  lily.txt  one_lotus.txt  rose.txt  three_lotus.txt  two_lotus.txt
[email protected]:~/tutorial$ cat flowers.txt 
lily.txt
one_lotus.txt
rose.txt
three_lotus.txt
two_lotus.txt

Nyní je mým cílem, abych viděl velikost všech souborů uvedených v souboru flowers.txt. Zdravý rozum říká, že bych mohl zkombinovat příkaz cat, aby se zobrazily všechny názvy souborů, a poté jej převést do příkazu du, abych zkontroloval velikost souboru.

Ale když to řeknu přímo, neudává velikost každého ze souborů uvedených v souboru flowers.txt.

[email protected]:~/tutorial$ du -h
52K	.
[email protected]:~/tutorial$ cat flowers.txt | du -h
52K	.

Proč? Za prvé, příkaz du nepřebírá standardní vstup. Za druhé, výstupem příkazu cat nejsou jednotlivé názvy souborů. Je to jako slova oddělená znakem nového řádku.

Kouzlo příkazu xargs je v tom, že vezme tento a text oddělené mezerami nebo novými řádky a převede je na jednotlivé vstupy do dalšího příkazu.

[email protected]:~/tutorial$ cat flowers.txt | xargs du -h
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Představte si to jako ekvivalent vkládání těchto jmen souborů do příkazu du:

[email protected]:~/tutorial$ du -h lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt 
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Už si uvědomujete sílu příkazu xargs, že?

xargs a najít:vytvořeno pro sebe

Často zjistíte, že se používá v kombinaci s „příkazem najít“. Příkaz find hledá soubory a adresáře a vrací jejich názvy. Díky xargs můžete použít výsledek příkazu find pro specifické účely, jako je přejmenování, přesun, smazání a podobně.

Řekněme, že chcete získat všechny soubory končící na .txt a obsahující slovo červené. Příkazy find a grep můžete kombinovat pomocí xargs:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt

Nakládání s názvy souborů s mezerami

Pokud máte soubor s mezerou v názvu, způsobí to problémy. Řekněme, že jsem přejmenoval three_lotus.txt na „tři lotus.txt“. Nyní, když je zpracován pomocí xargs, je vnímán jako dva samostatné soubory jako tři a lotus.txt.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./two_lotus.txt
grep: ./three: No such file or directory
grep: lotus.txt: No such file or directory
./rose.txt

V takových případech byste měli použít volbu -print0 příkazu find. Řádky odděluje prázdnými znaky ASCII namísto znaků nového řádku. Podobně byste také měli použít xargs s -0, abyste přijali ASCII null.

[email protected]:~/tutorial$ find . -type f -print0 -name "*.txt" | xargs -0 grep -l red
./two_lotus.txt
./three lotus.txt
./rose.txt

Podívejte se, jaký příkaz se provádí

Pokud chcete vidět, jaký příkaz se provádí pomocí xargs, můžete použít volbu -t. Vypíše skutečný prováděný příkaz.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -t touch
touch ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt

Vynutit xargs výzvu k potvrzení před spuštěním příkazu

Některé situace vyžadují zvýšenou opatrnost, jako je mazání souborů. Bude dobré se podívat, jaký příkaz se má provést, a mít možnost provedení odmítnout.

Pro zobrazení výzvy můžete použít volbu -p xargs.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p rm
rm ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...n

Použití zástupného symbolu s xargs k získání větší kontroly

Ve výchozím nastavení příkaz xargs přidává standardní vstup jako argument na konec příkazu. To vytváří problém, když jej potřebujete použít před posledním argumentem.

Pokud například použijete příkaz přesunout, potřebujete nejprve zdroj a poté cíl. Pokud chcete nalezené soubory přesunout do cílového adresáře, tento příkaz nebude fungovat:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p mv new_dir
mv new_dir ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...y
mv: target './rose.txt' is not a directory

Zde můžete použít zástupné symboly v xargs s volbou -To se mi líbí:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p -I {} mv {} new_dir
mv ./three_lotus.txt new_dir ?...n
mv ./two_lotus.txt new_dir ?...n
mv ./lily.txt new_dir ?...n
mv ./rose.txt new_dir ?...n

Představte si to, jako kdyby xargs získal všechny názvy souborů z příkazu find a ponechal je v {}. Poté přejde k příkazu mv a poskytne obsah {}.

Hlavní rozdíl je v tom, že místo vkládání všech názvů souborů do stejného příkazu je přidává jeden po druhém. To je důvod, proč byl pro každý argument zavolán příkaz mv (jak můžete vidět ve výše uvedeném příkladu).

Poznámka:Jako zástupný symbol jsem použil {}. Jako zástupný symbol můžete použít většinu jiných písmen nebo znaků. {} je sázka na jistotu a je snadno pochopitelná a rozlišitelná.

Spouštění více příkazů pomocí xargs

Zástupné symboly můžete použít ke spuštění více příkazů s xargs.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}' 
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./three_lotus.txt
0	./three_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./two_lotus.txt
0	./two_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./lily.txt
0	./lily.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./rose.txt
0	./rose.txt

Mějte na paměti, že zástupný symbol se nerozšíří na další přesměrování kanálu nebo jiný příkaz. Proto jsem zde použil příkaz sh.

Vždy je toho víc…

V příkladech jsem použil hlavně find s příkazem xargs, protože to je to, co uvidíte nejvíce. Ale to neznamená, že xargs je omezeno na použití pouze s příkazem find. Jedním takovým praktickým příkladem příkazu xargs je situace, kdy chcete zastavit všechny spuštěné kontejnery dockeru:

docker ps -q | xargs docker stop

Stejně jako většina ostatních linuxových příkazů existuje i s xargs mnohem více možností. Pro více informací se vždy můžete podívat na manuálovou stránku příkazu xargs.

Myslím, že příklady příkazů xargs zde uvedené jsou dostatečné k tomu, abyste tomuto úžasnému příkazu dobře porozuměli.

Pokud máte nějaké dotazy nebo návrhy, dejte mi vědět v sekci komentářů.


Linux
  1. Jak používat Linuxový příkaz grep

  2. Jak používat příkaz id v Linuxu

  3. Jak používat příkaz „screen“ v Linuxu

  1. Jak používat příkaz historie v Linuxu

  2. Který příkaz v Linuxu [vysvětleno s příklady]

  3. Jak používáte regulární výrazy s příkazem cp v Linuxu?

  1. Jak používat w Command v Linuxu s příklady

  2. Jak používat příkaz historie Linuxu

  3. Jak používat Linux Cat Command (s příklady)