xargs komutu: Kullanımı, -n ve -I seçenekleri ve find ile birlikte kullanım
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ı
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.txtalice
bob
carol
dave
erincat çı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 echoalice bob carol dave erinArkasına komut yazmazsanız xargs echo çalıştırır, bu yüzden sonuç aynıdır.
cat names.txt | xargsalice bob carol dave erinBoru, ö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.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Araya 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 total2️⃣ xargs -n ve -I seçenekleri
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.
-n 1, her ad için echo çalıştırır ve beş satır çıkar.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 ikişerli gruplar, kalan biri ayrı verir.
cat names.txt | xargs -n 2 echoalice 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 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinArgü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: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinAynı 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 homecat names.txt | xargs -I {} mkdir home/{}ls homealice 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 echoalice bob
carol dave
erin3️⃣ find ve xargs birlikte kullanımı
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.logBu 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 totalfind 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 totalfind 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 totalBulunan 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.log4️⃣ xargs komutuyla dosya silme
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 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.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 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.txty girerseniz üç dosya silinir ve yalnızca keep.txt kalır.
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.txtGirdi 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 rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ xargs paralel çalıştırma, ayırıcı ve seçenekler
🔲 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.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sGirdi 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 echoalice
bob
carolStandart 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 echoalice bob carol dave erin🔲 xargs komutu seçenekleri
📌 Başlıca seçenekler: bu yazıda çalıştırılan sonuçlar
| Seçenek | Görev | Bu yazıdaki sonuç | |
|---|---|---|---|
| -n | Komutun tek çalıştırmasına verilecek argüman sayısını belirler | Beş ad -n 2 ile ikişerli gruplanır, echo üç kez çalışır | |
| -I | Yer 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 | |
| -L | Komutun tek çalıştırmasına verilecek satır sayısını belirler | Her satırda tek ad bulunan dosyada -n 2 ile aynı sonuç | |
| -t | Çalışacak komut satırını önce yazdırır | Komut satırı çıktıdan önce çıkar | |
| -0 | Girdiyi 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 | |
| -p | Her komut için çalıştırılıp çalıştırılmayacağını sorar | n ise kalır, y ise üç dosya silinir | |
| -r | Girdi boşsa komutu çalıştırmaz | Olmazsa [rm: missing operand], eklenirse çalışmaz | |
| -P | Aynı anda çalışacak komut sayısını belirler | Dört sleep sırayla 10 saniye, -P 4 ile 4 saniye | |
| -d | Girdiyi bölecek ayırıcıyı belirler | -d , ile her ad için bir satır | |
| -a | Girdiyi standart girdi yerine dosyadan okur | names.txt dosyasındaki beş ad tek bir echo komutuna gider |
📎 Diğer seçenekler: resmî kılavuza göre
| Seçenek | Görev | |
|---|---|---|
| -s | Bir komut satırındaki en fazla karakter sayısını belirler | |
| -x | -s boyutunu aşarsa çalıştırmadan biter | |
| -E | Girdide 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-var | Aynı 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.
🔢 SSS & önerilen içerikler
Metin arama
Linux grep komutu
Dosyaların içinde metin ve düzenli ifadelerle eşleşen satırları bulan grep komutudur. xargs ile verilen birden çok dosyayı tek seferde aramak için kullanılır.
Dosya silme
Linux rm komutu
Dosya ve klasörleri silen rm komutu ile -rf seçeneğinin tehlikelerini anlatan yazıdır. xargs arkasına rm eklemeden önce seçenekleri kontrol edin.
Süreç sonlandırma
Linux kill komutu
Süreç numarasına sinyal gönderip sonlandıran kill komutudur. Süreç numarası listesini xargs ile verip sonlandırırken devamında kullanılır.
ℹ️ 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.