Polecenie xargs: użycie, opcje -n i -I oraz łączenie z find
Polecenie xargs to narzędzie Linuksa, które zamienia wiersze i słowa odebrane ze standardowego wejścia na argumenty innego polecenia i je uruchamia. Po przekazaniu przez xargs do wc trzech plików dziennika znalezionych przez find w folderze roboczym na serwerze AlmaLinux 9 plik ze spacją w nazwie został rozbity na dwa i pojawił się błąd, a z -print0 i -0 wyświetliły się liczby wierszy wszystkich trzech plików.
Poniższe dane wyjściowe pochodzą z folderu roboczego na koncie root serwera AlmaLinux 9.8. Lista nazw, dzienniki i pliki tymczasowe to przykładowe pliki utworzone do testu, a adresy IP i ścieżki folderów w nich to także wartości przykładowe.
1️⃣ Podstawy polecenia xargs
xargs dzieli standardowe wejście z poprzedniego polecenia na spacjach i znakach nowego wiersza, a potem uruchamia polecenie wpisane za nim z tymi częściami jako argumentami. Sprawdzono to na names.txt, gdzie w każdym wierszu jest jedna nazwa.
cat names.txtalice
bob
carol
dave
erinGdy przekażesz dane wyjściowe cat do xargs echo, pięć wierszy stanie się argumentami jednego echo i pojawi się w jednym wierszu.
cat names.txt | xargs echoalice bob carol dave erinGdy nie wpiszesz za nim polecenia, xargs uruchomi echo, więc wynik będzie taki sam.
cat names.txt | xargsalice bob carol dave erinPotok łączy dane wyjściowe poprzedniego polecenia ze standardowym wejściem następnego, więc do argumentów następnego polecenia nic nie trafia. Gdy przekażesz samym potokiem do wc -l plik list.txt z trzema nazwami plików, wc policzy 3 wiersze samej listy.
cat list.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Z xargs pośrodku trzy nazwy z listy stają się argumentami wc i pojawia się liczba wierszy każdego pliku.
cat list.txt | xargs wc -l 3 logs/access.log
2 logs/error.log
1 tmp/keep.txt
6 total2️⃣ Opcje -n i -I polecenia xargs
Bez opcji całe wejście trafia do jednego uruchomienia polecenia. Aby je powtarzać, ustaw przez -n, ile argumentów przekazywać naraz. Na rysunku poniżej widać, jak te same pięć nazw jest grupowanych zależnie od opcji.
-n 1 uruchamia echo dla każdej nazwy i pojawia się pięć wierszy.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 grupuje po dwie, a pozostałą nazwę przekazuje osobno.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinAby zobaczyć uruchamiane polecenia, dodaj -t. Najpierw pojawia się wiersz polecenia, a pod nim dane wyjściowe.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinGdy argument ma stać gdzie indziej niż na końcu polecenia, ustaw symbol zastępczy przez -I. W miejsce {} trafia po jednym wierszu, a gdy ten sam tekst występuje kilka razy, zmieniane są wszystkie wystąpienia.
cat names.txt | xargs -I {} echo 'user: {}'user: alice
user: bob
user: carol
user: dave
user: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinW ten sam sposób możesz utworzyć folder dla każdej nazwy. Najpierw utwórz folder home, a potem przez -I {} utwórz w nim folder dla każdej nazwy: powstanie pięć folderów.
mkdir homecat names.txt | xargs -I {} mkdir home/{}ls homealice bob carol dave erin-I traktuje jeden wiersz jako jeden argument, więc nie można używać go z -n. Po wpisaniu obu -I zostało zignorowane z ostrzeżeniem, a {} wypisano dosłownie.
cat names.txt | xargs -I {} -n 2 echo {}xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin-L grupuje według liczby wierszy. Gdy w wierszu jest kilka słów, przekazywane są razem, a w names.txt z jedną nazwą w wierszu -L 2 dało ten sam wynik co -n 2.
cat names.txt | xargs -L 2 echoalice bob
carol dave
erin3️⃣ Łączenie find i xargs
Listy nazw nie trzeba tworzyć ręcznie: pliki znalezione przez find można przekazać wprost do xargs. Wyszukanie plików kończących się na .log w folderze dzienników daje trzy, a jeden z nich ma spację w nazwie.
find /root/work/logs -name '*.log'/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.logPo przekazaniu tej listy wprost do xargs wc -l nazwa ze spacją rozpadła się na old i access.log, pojawiły się dwa wiersze błędu, a suma wyniosła tylko 5 wierszy z dwóch plików.
find /root/work/logs -name '*.log' | xargs wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
5 total-print0 w find oddziela nazwy znakiem null zamiast znaku nowego wiersza, a -0 w xargs dzieli argumenty wyłącznie na tym znaku null. Razem dają liczby wierszy wszystkich trzech plików, także tego ze spacją.
find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalOpcja -exec w find robi to samo. Z + po {} znalezione pliki są przekazywane naraz, więc wynik jest taki sam, a find przekazuje spacje w nazwach bez zmian. xargs przyjmuje też dane z innych poleceń, więc używaj go, gdy wejście nie pochodzi tylko z find albo gdy trzeba ustalić liczbę elementów naraz (-n) lub liczbę równoczesnych uruchomień (-P).
find /root/work/logs -name '*.log' -exec wc -l {} + 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalAby wybrać spośród znalezionych tylko pliki z danym tekstem, dodaj za xargs grep -l. wp-login zawierały dwa pliki: dziennik dostępu i dziennik błędów.
find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login/root/work/logs/access.log
/root/work/logs/error.log4️⃣ Usuwanie plików poleceniem xargs
Z rm za xargs znalezione pliki są usuwane naraz, więc przed usunięciem sprawdź, które pliki zostaną przekazane. Gdy postawisz echo przed rm, pojawi się tylko wiersz polecenia, które by się uruchomiło, a pliki zostaną na miejscu.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmpls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtZ -p xargs pyta o każde polecenie, czy je uruchomić. Po wpisaniu n nic nie jest usuwane i trzy pliki tymczasowe zostają.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...nls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtPo wpisaniu y trzy pliki są usuwane i zostaje tylko keep.txt.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtGdy wejście jest puste, xargs uruchamia polecenie raz bez argumentów. Po przekazaniu pustego pliku rm działa bez argumentów i zgłasza błąd [rm: missing operand]; z -r polecenie w ogóle się nie uruchamia.
cat empty.txt | xargs rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Uruchamianie równoległe, separatory i opcje xargs
🔲 Uruchamianie równoległe i separatory
Gdy polecenia działają po kolei, przy wielu celach czas odpowiednio rośnie. -P ustala, ile poleceń działa równocześnie. Cztery sleep czekające 1, 2, 3 i 4 sekundy zajęły po kolei 10 sekund, a równocześnie z -P 4 skończyły w najdłuższe 4 sekundy.
time seq 1 4 | xargs -n 1 sleep
real 0m10.007s
user 0m0.004s
sys 0m0.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sGdy wejście jest podzielone innym znakiem niż nowy wiersz lub spacja, ustaw separator przez -d. Po podziale przez -d , trzech nazw połączonych przecinkami każda nazwa ma swój wiersz.
printf 'alice,bob,carol' | xargs -d , -n 1 echoalice
bob
carolAby czytać z pliku zamiast ze standardowego wejścia, podaj jego nazwę w -a. Pięć nazw z names.txt trafiło do echo bez potoku.
xargs -a names.txt echoalice bob carol dave erin🔲 Opcje polecenia xargs
📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| -n | Ustala, ile argumentów trafia do jednego uruchomienia polecenia | Pięć nazw jest grupowanych po dwie przez -n 2, a echo uruchamia się trzy razy | |
| -I | Wstawia po jednym wierszu do symbolu zastępczego i uruchamia dla każdego wiersza | W miejsce {} trafia nazwa; wpisane z -n, -I jest ignorowane z ostrzeżeniem | |
| -L | Ustala, ile wierszy trafia do jednego uruchomienia polecenia | W pliku z jedną nazwą w wierszu ten sam wynik co -n 2 | |
| -t | Najpierw wypisuje wiersz polecenia do uruchomienia | Wiersz polecenia pojawia się przed danymi wyjściowymi | |
| -0 | Dzieli wejście wyłącznie na znaku null (razem z find -print0) | Bez niej nazwy ze spacją się rozpadają i są dwa wiersze błędu; z nią wszystkie trzy pliki mają po 6 wierszy | |
| -p | Pyta o każde polecenie, czy je uruchomić | Przy n zostają, przy y trzy pliki są usuwane | |
| -r | Nie uruchamia polecenia, gdy wejście jest puste | Bez niej [rm: missing operand], z nią nic się nie uruchamia | |
| -P | Ustala, ile poleceń działa równocześnie | Cztery sleep: po kolei 10 sekund, z -P 4 tylko 4 sekundy | |
| -d | Ustala separator dzielący wejście | -d , daje jeden wiersz na nazwę | |
| -a | Czyta wejście z pliku zamiast ze standardowego wejścia | Pięć nazw z names.txt trafia do jednego echo |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| -s | Ustala maksymalną liczbę znaków w wierszu polecenia | |
| -x | Po przekroczeniu rozmiaru -s kończy bez uruchamiania | |
| -E | Przestaje czytać wejście po dojściu do wiersza z samym tym tekstem | |
| -o | Ponownie otwiera terminal jako standardowe wejście polecenia (dla programów interaktywnych) | |
| --process-slot-var | Wstawia inny numer do zmiennej środowiskowej dla każdego równoczesnego polecenia |
🔲 Symulator polecenia xargs
W symulatorze poniżej możesz samodzielnie wpisywać polecenia xargs i find na tych samych plikach testowych.
🔢 FAQ & polecane treści
Wyszukiwanie tekstu
Polecenie grep w Linuksie
Polecenie grep znajduje w plikach wiersze pasujące do tekstu i wyrażeń regularnych. Używaj go do przeszukiwania naraz wielu plików przekazanych przez xargs.
Usuwanie plików
Polecenie rm w Linuksie
Artykuł o poleceniu rm, które usuwa pliki i foldery, oraz o zagrożeniach opcji -rf. Sprawdź opcje, zanim postawisz rm za xargs.
Kończenie procesów
Polecenie kill w Linuksie
Polecenie kill wysyła sygnał do numeru procesu i go kończy. Użyj go, gdy przekazujesz przez xargs listę numerów procesów do zakończenia.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.