xargs komutu: Kullanımı, -n ve -I seçenekleri ve find ile birlikte kullanım

Test ortamıRHEL ailesiAlmaLinux 9.8root hesabı2026-10-29 tarihinde kontrol edildi

xargs komutu, standart girdiden aldığı satır ve sözcükleri başka bir komutun argümanlarına dönüştürüp çalıştıran bir Linux aracıdır. AlmaLinux 9 sunucusundaki çalışma klasöründe find komutunun bulduğu üç günlük dosyasını xargs ile wc komutuna verdiğimizde, adında boşluk bulunan bir dosya ikiye bölünüp hataya yol açtı; -print0 ve -0 eklenince üç dosyanın da satır sayısı çıktı.

Aşağıdaki çıktılar AlmaLinux 9.8 sunucusunda root hesabıyla çalışma klasörünün içinde alınan sonuçlardır. Ad listesi, günlükler ve geçici dosyalar test için oluşturulmuş örnek dosyalardır; içlerindeki IP adresleri ve klasör yolları da örnek değerlerdir.

1️⃣ xargs komutunun temel kullanımı

  • ↪️ Standart girdiyi komut argümanlarına çevirme

xargs, önceki komutun verdiği standart girdiyi boşluk ve satır sonlarına göre böler ve arkasına yazılan komutu bu parçaları argüman olarak ekleyip çalıştırır. Bunu her satırda bir ad bulunan names.txt ile doğruladık.

cat names.txt
alice
bob
carol
dave
erin

cat çıktısını xargs echo komutuna verirseniz beş satır tek bir echo komutunun argümanı olur ve tek satırda çıkar.

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

Arkasına komut yazmazsanız xargs echo çalıştırır, bu yüzden sonuç aynıdır.

cat names.txt | xargs
alice bob carol dave erin

Boru, önceki komutun çıktısını sonraki komutun standart girdisine bağlayan bir yoldur; bu yüzden sonraki komutun argümanlarına hiçbir şey girmez. Üç dosya adı içeren list.txt dosyasını yalnızca boruyla wc -l komutuna verirseniz wc, listenin kendi 3 satırını sayar.

cat list.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Araya xargs koyarsanız listedeki üç ad wc komutunun argümanı olur ve her dosyanın satır sayısı çıkar.

cat list.txt | xargs wc -l
  3 logs/access.log
  2 logs/error.log
  1 tmp/keep.txt
  6 total

2️⃣ xargs -n ve -I seçenekleri

  • ↪️ Grup boyutu, argüman konumu ve -t ile kontrol

Seçenek yoksa girdinin tamamı komutun tek çalıştırmasına girer; bu yüzden komutu yinelemek için -n ile bir seferde verilecek argüman sayısını belirlersiniz. Aşağıdaki şekilde aynı beş adın seçeneğe göre nasıl gruplandığını görebilirsiniz.

🧩 xargs standart girdiyi komut argümanlarına nasıl gruplar
Açıklama diyagramı
⚙️ Seçenek
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Standart girdi (names.txt)alicebobcaroldaveerinHer satırda bir ad, beş satır.
② Argümanlara gruplamaalicebobcaroldaveerinSeçenek yoksa beşi tek grup olur.alicebobcaroldaveerin-n 2 ikişerli gruplar, kalan biri ayrı gruplanır.alicebobcaroldaveerin-I {} bir satırı bir grup yapar ve {} yerine koyar.
③ Çalışan komutlar ve çıktıecho alice bob carol dave erinalice bob carol dave erinecho bir kez çalışır.echo alice bobecho carol daveecho erinecho üç kez çalışır, grup başına bir satır çıkar.echo 'user: alice' echo 'user: bob' … erin adına kadar aynı biçimde beş kezuser: aliceuser: bobuser: caroluser: daveuser: erinecho beş kez çalışır, {} yerine ad girer.
Seçenek yoksa xargs girdiden okuduğu tüm sözcükleri komutun tek çalıştırmasına argüman olarak ekler. Beş ad tek bir echo komutuna gider ve tek satırda çıkar.
-n 2 eklenirse sözcükler ikişerli gruplanır ve komut yinelenir. Beş ad üç grup olur, bu yüzden echo üç kez çalışır.
-I {} eklenirse bir satır tek birim sayılır, komuttaki {} yerine o satır konur ve komut satır başına çalışır. Argümanın en sonda olmaması gereken durumlarda kullanılır.

-n 1, her ad için echo çalıştırır ve beş satır çıkar.

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

-n 2 ikişerli gruplar, kalan biri ayrı verir.

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

Çalışan komutları görmek için -t eklersiniz. Önce komut satırı çıkar, altında çıktısı gelir.

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

Argümanın komutun sonunda olmaması gerekiyorsa -I ile yer tutucu belirlersiniz. {} yerine her seferinde bir satır girer, aynı metin birkaç kez geçiyorsa hepsi değişir.

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

Aynı yöntemle ad başına klasör oluşturabilirsiniz. Önce home klasörünü oluşturup -I {} ile altına ad başına klasör açarsanız beş klasör oluşur.

mkdir home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  bob  carol  dave  erin

-I bir satırı tek argüman saydığı için -n ile birlikte kullanılamaz. İkisini birlikte yazdığımızda -I uyarıyla yok sayıldı ve {} olduğu gibi yazdırıldı.

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 satır sayısına göre gruplar. Bir satırda birden çok sözcük varsa o satırın sözcükleri birlikte gider; her satırda tek ad bulunan names.txt dosyasında -L 2, -n 2 ile aynı sonucu verdi.

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

3️⃣ find ve xargs birlikte kullanımı

  • ↪️ -print0 ve -0 ile boşluklu dosya adlarını verme

Ad listesini elle oluşturmanız gerekmez; find komutunun bulduğu dosyaları doğrudan xargs komutuna verebilirsiniz. Günlük klasöründe .log ile biten dosyaları aradığınızda üç dosya çıkar, birinin adında boşluk vardır.

find /root/work/logs -name '*.log'
/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.log

Bu liste olduğu gibi xargs wc -l komutuna verilince boşluklu ad old ve access.log diye ikiye bölündü, iki hata satırı çıktı ve toplam yalnızca iki dosyanın 5 satırı oldu.

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

find komutunun -print0 seçeneği adları satır sonu yerine null karakteriyle ayırır, xargs komutunun -0 seçeneği de argümanları yalnızca bu null karakteriyle böler. İkisi birlikte kullanılınca boşluklu dosya dahil üç dosyanın satır sayısı çıkar.

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

find komutunun -exec seçeneği de aynı işi yapar. {} sonrasına + eklenirse bulunan dosyalar tek seferde verilir, bu yüzden sonuç aynıdır ve dosya adlarındaki boşlukları find olduğu gibi iletir. xargs find dışındaki komutların çıktısını da aldığı için, girdi yalnızca find komutundan gelmediğinde veya bir seferde verilecek sayıyı (-n) ya da eşzamanlı çalıştırma sayısını (-P) belirlemeniz gerektiğinde xargs kullanılır.

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

Bulunan dosyalardan yalnızca bir metin içerenleri seçmek için xargs arkasına grep -l eklersiniz. wp-login içeren dosyalar erişim günlüğü ve hata günlüğü olmak üzere ikiydi.

find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login
/root/work/logs/access.log
/root/work/logs/error.log

4️⃣ xargs komutuyla dosya silme

  • ↪️ Önce echo ile görme ve -p ile onaylama

xargs arkasına rm eklenirse bulunan dosyalar tek seferde silinir; bu yüzden silmeden önce hangi dosyaların verileceğini kontrol edersiniz. rm önüne echo koyarsanız yalnızca çalışacak komut satırı çıkar ve dosyalar yerinde kalır.

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

-p eklenirse xargs her komut için çalıştırılıp çalıştırılmayacağını sorar. n girerseniz hiçbir şey silinmez ve üç geçici dosya yerinde kalır.

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

y girerseniz üç dosya silinir ve yalnızca keep.txt kalır.

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

Girdi boşsa xargs komutu argümansız bir kez çalıştırır. Boş dosya verirseniz rm argümansız çalışır ve [rm: missing operand] hatası çıkar; -r eklenirse komut hiç çalışmaz.

cat empty.txt | xargs rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ xargs paralel çalıştırma, ayırıcı ve seçenekler

  • ↪️ -P, -d ve -a seçenekleri

🔲 Paralel çalıştırma ve ayırıcı

Komutlar tek tek sırayla çalışırsa hedef çok olduğunda süre de o kadar uzar. -P aynı anda çalışacak komut sayısını belirler. 1, 2, 3 ve 4 saniye bekleyen dört sleep sırayla 10 saniyede, -P 4 ile aynı anda en uzun olan 4 saniyede bitti.

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

Girdi satır sonu veya boşluk dışında bir simgeyle ayrılmışsa ayırıcıyı -d ile belirlersiniz. Virgülle bağlanmış üç adı -d , ile ayırırsanız her ad için bir satır çıkar.

printf 'alice,bob,carol' | xargs -d , -n 1 echo
alice
bob
carol

Standart girdi yerine dosyadan okumak için -a seçeneğine dosya adını yazarsınız. names.txt dosyasındaki beş ad borusuz olarak echo komutuna gitti.

xargs -a names.txt echo
alice bob carol dave erin

🔲 xargs komutu seçenekleri

📌 Başlıca seçenekler: bu yazıda çalıştırılan sonuçlar

SeçenekGörevBu yazıdaki sonuç
-nKomutun tek çalıştırmasına verilecek argüman sayısını belirlerBeş ad -n 2 ile ikişerli gruplanır, echo üç kez çalışır
-IYer tutucuya her seferinde bir satır koyup satır başına çalıştırır{} yerine ad girer; -n ile birlikte yazılırsa -I uyarıyla yok sayılır
-LKomutun tek çalıştırmasına verilecek satır sayısını belirlerHer satırda tek ad bulunan dosyada -n 2 ile aynı sonuç
-tÇalışacak komut satırını önce yazdırırKomut satırı çıktıdan önce çıkar
-0Girdiyi yalnızca null karakteriyle böler (find -print0 ile birlikte)Olmazsa boşluklu adlar bölünür ve iki hata satırı çıkar; eklenirse üç dosyanın hepsi 6 satır
-pHer komut için çalıştırılıp çalıştırılmayacağını sorarn ise kalır, y ise üç dosya silinir
-rGirdi boşsa komutu çalıştırmazOlmazsa [rm: missing operand], eklenirse çalışmaz
-PAynı anda çalışacak komut sayısını belirlerDört sleep sırayla 10 saniye, -P 4 ile 4 saniye
-dGirdiyi bölecek ayırıcıyı belirler-d , ile her ad için bir satır
-aGirdiyi standart girdi yerine dosyadan okurnames.txt dosyasındaki beş ad tek bir echo komutuna gider

📎 Diğer seçenekler: resmî kılavuza göre

SeçenekGörev
-sBir komut satırındaki en fazla karakter sayısını belirler
-x-s boyutunu aşarsa çalıştırmadan biter
-EGirdide yalnızca bu metni içeren satıra gelince kalan girdiyi okumaz
-oÇalışan komutun standart girdisini terminale yeniden açar (etkileşimli programlar için)
--process-slot-varAynı anda çalışan her komut için ortam değişkenine farklı numara koyar

🔲 xargs komutu simülatörü

Aşağıdaki simülatörde aynı test dosyalarında xargs ve find komutlarını kendiniz yazabilirsiniz.

xargs komutu simülatörüGNU findutils 4.8
[root@server work]#
Klavyedeki ↑↓ tuşlarıyla daha önce yazdığınız komutları geri çağırabilirsiniz.

🔢 SSS & önerilen içerikler

Süreç numarasını verirseniz kill o numaraya sinyal gönderir. Arka planda çalıştırılan sleep 600 sürecinin numarasını $! kabuk değişkeniyle alıp xargs kill komutuna verdiğimizde iş listesinde [Terminated sleep 600] kaldı ve sonraki jobs komutunda iş kayboldu. Numara listesini başka bir komutla topluyorsanız hangi süreçlerin dahil olduğunu önce yazdırıp sonra verin.

--show-limits seçeneği sınırları yazdırır. Test edilen sunucuda komut satırı uzunluğunun POSIX üst sınırı 2,093,890 bayt, xargs komutunun gerçekte kullandığı komut arabelleği ise 131,072 bayttı. Kılavuza göre girdi bu arabellekten uzunsa xargs komutu birkaç çalıştırmaya böler.

xargs ile çalışan komutlardan biri bile 1 ile 125 arasında bir kodla başarısız olursa xargs çıkış kodu 123 olur. Boşluklu dosya adı bölünen wc çalıştırması ve boş girdiyle çalışan rm ikisi de 123 verdi, komutun bulunamadığı durum ise 127 oldu. Kabuk betiklerinde xargs sonrası çıkış kodunu kontrol ederken bu değerleri esas alın.

ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 6   +   1   =