Polecenie xargs: użycie, opcje -n i -I oraz łączenie z find

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-10-29

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

  • ↪️ Standardowe wejście jako argumenty polecenia

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.txt
alice
bob
carol
dave
erin

Gdy 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 echo
alice bob carol dave erin

Gdy nie wpiszesz za nim polecenia, xargs uruchomi echo, więc wynik będzie taki sam.

cat names.txt | xargs
alice bob carol dave erin

Potok łą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.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Z 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 total

2️⃣ Opcje -n i -I polecenia xargs

  • ↪️ Rozmiar grupy, pozycja argumentu i sprawdzanie przez -t

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.

🧩 Jak xargs grupuje standardowe wejście w argumenty polecenia
Diagram objaśniający
⚙️ Opcja
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Standardowe wejście (names.txt)alicebobcaroldaveerinJedna nazwa w wierszu, pięć wierszy.
② Grupowanie w argumentyalicebobcaroldaveerinBez opcji pięć nazw tworzy jedną grupę.alicebobcaroldaveerin-n 2 grupuje po dwie, a pozostałą nazwę umieszcza osobno.alicebobcaroldaveerin-I {} traktuje jeden wiersz jako grupę i wstawia go w miejsce {}.
③ Uruchamiane polecenia i dane wyjścioweecho alice bob carol dave erinalice bob carol dave erinecho uruchamia się raz.echo alice bobecho carol daveecho erinecho uruchamia się trzy razy, po jednym wierszu na grupę.echo 'user: alice' echo 'user: bob' … pięć razy w tej samej formie aż do erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho uruchamia się pięć razy, a w miejsce {} trafia nazwa.
Bez opcji xargs dołącza wszystkie słowa odczytane z wejścia jako argumenty jednego uruchomienia. Pięć nazw trafia do jednego echo i pojawia się w jednym wierszu.
Z -n 2 słowa są grupowane po dwa, a polecenie się powtarza. Pięć nazw tworzy trzy grupy, więc echo uruchamia się trzy razy.
Z -I {} jeden wiersz liczy się jako całość, trafia w miejsce {} w poleceniu, a polecenie uruchamia się dla każdego wiersza. Używaj tego, gdy argument ma stać gdzie indziej niż na końcu.

-n 1 uruchamia echo dla każdej nazwy i pojawia się pięć wierszy.

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2 grupuje po dwie, a pozostałą nazwę przekazuje osobno.

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

Aby zobaczyć uruchamiane polecenia, dodaj -t. Najpierw pojawia się wiersz polecenia, a pod nim dane wyjściowe.

cat names.txt | xargs -t -n 2 echo
echo alice bob
alice bob
echo carol dave
carol dave
echo erin
erin

Gdy 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: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

W 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 home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  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 echo
alice bob
carol dave
erin

3️⃣ Łączenie find i xargs

  • ↪️ Przekazywanie nazw plików ze spacjami przez -print0 i -0

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.log

Po 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 total

Opcja -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 total

Aby 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.log

4️⃣ Usuwanie plików poleceniem xargs

  • ↪️ Podgląd przez echo i potwierdzanie przez -p

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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Z -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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Po wpisaniu y trzy pliki są usuwane i zostaje tylko keep.txt.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

Gdy 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 rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Uruchamianie równoległe, separatory i opcje xargs

  • ↪️ Opcje -P, -d i -a

🔲 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.003s
time seq 1 4 | xargs -n 1 -P 4 sleep

real	0m4.005s
user	0m0.001s
sys	0m0.006s

Gdy 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 echo
alice
bob
carol

Aby 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 echo
alice bob carol dave erin

🔲 Opcje polecenia xargs

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
-nUstala, ile argumentów trafia do jednego uruchomienia poleceniaPięć nazw jest grupowanych po dwie przez -n 2, a echo uruchamia się trzy razy
-IWstawia po jednym wierszu do symbolu zastępczego i uruchamia dla każdego wierszaW miejsce {} trafia nazwa; wpisane z -n, -I jest ignorowane z ostrzeżeniem
-LUstala, ile wierszy trafia do jednego uruchomienia poleceniaW pliku z jedną nazwą w wierszu ten sam wynik co -n 2
-tNajpierw wypisuje wiersz polecenia do uruchomieniaWiersz polecenia pojawia się przed danymi wyjściowymi
-0Dzieli 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
-pPyta o każde polecenie, czy je uruchomićPrzy n zostają, przy y trzy pliki są usuwane
-rNie uruchamia polecenia, gdy wejście jest pusteBez niej [rm: missing operand], z nią nic się nie uruchamia
-PUstala, ile poleceń działa równocześnieCztery sleep: po kolei 10 sekund, z -P 4 tylko 4 sekundy
-dUstala separator dzielący wejście-d , daje jeden wiersz na nazwę
-aCzyta wejście z pliku zamiast ze standardowego wejściaPięć nazw z names.txt trafia do jednego echo

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-sUstala maksymalną liczbę znaków w wierszu polecenia
-xPo przekroczeniu rozmiaru -s kończy bez uruchamiania
-EPrzestaje czytać wejście po dojściu do wiersza z samym tym tekstem
-oPonownie otwiera terminal jako standardowe wejście polecenia (dla programów interaktywnych)
--process-slot-varWstawia 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.

Symulator polecenia xargsGNU findutils 4.8
[root@server work]#
Klawiszami ↑↓ przywołasz wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Po przekazaniu numeru procesu kill wysyła sygnał do tego numeru. Gdy numer procesu sleep 600 uruchomionego w tle pobrano zmienną powłoki $! i przekazano do xargs kill, na liście zadań zostało [Terminated sleep 600], a przy następnym jobs zadania już nie było. Gdy zbierasz numery innym poleceniem, najpierw wypisz, które procesy są na liście, a dopiero potem je przekaż.

Opcja --show-limits wypisuje limity. Na testowym serwerze górny limit POSIX długości wiersza polecenia wyniósł 2,093,890 bajtów, a faktycznie używany przez xargs bufor polecenia 131,072 bajty. Według podręcznika, gdy wejście jest dłuższe niż ten bufor, xargs dzieli polecenie na kilka uruchomień.

Gdy choć jedno polecenie uruchomione przez xargs nie powiedzie się z kodem od 1 do 125, kod wyjścia xargs wynosi 123. Zarówno wc z rozbitą nazwą pliku, jak i rm z pustym wejściem dały 123, a nieznalezione polecenie dało 127. Przyjmij te wartości, sprawdzając kod wyjścia po xargs w skryptach powłoki.

ℹ️ 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 1   +   7   =