19.10.2023

linux'ta xargs komutu

xargs komutu, pipeline'dan veri almayı desteklemeyen komutlara bu özelliği kazandırmak için kullanılabilir. Hiçbir parametre kullanmadığımızda her biri yeni bir satıra yazılmış öğeleri boşluk ile ayrılmış şekilde aynı satıra yazar. Örnek olarak sehirler.txt dosyamızda şehir isimleri, her satırda bir tane olacak şekilde yazılmış olsun.

$ cat sehirler.txt

Bursa
Ankara
Kocaeli
Antalya
Adana

Bu şehir isimlerini tek satırda, boşluk ile ayrılmış şekilde yazmak için

$ cat sehirler.txt | xargs

kullanabiliriz. Bu elbette, xarg komutunun tüm yeteneklerini gösterecek bir örnek değil.

Mevcut klasörde dosya1.txt, dosya2.txt ve dosya3.txt adında 3 dosyamız olsun. Bunların içlerinde kaç kelime ve satır var, görmek istiyoruz.

$ ls dosya*.txt | wc

çalışmaz. Çünkü wc, pipeline input'u desteklemez. Bunu çalışır hale getirmek için

$ ls dosya*.txt | xargs wc

yapabilriz. Ya da bir log klasöründe 1 haftadan eski log dosyalarını silmek istiyoruz diyelim. Önce bu dosyaları bulalım:

$ find /var/log/ -type f -mtime +7

Bu komut ile bulunan dosyaları silmek için 

$ find /var/log/ -type f -mtime +7 | rm

işe yaramaz, çünkü rm stdin'den veri okumaz. Evet, find'in -exec parametresi ile de çözülebilir, ama örnek olması açısından şöyle bir kullanım xarg'ı açıklayabilir:

$ find /var/log -type f -mtime +7 | xargs rm

sehirler.txt dosyasının içeriğinin tek satırda yazıldığı örnekteki gibi, yukarıdaki örnek de aslında şuna eşdeğer bir işlem yapar:

$ rm log01.txt log02.txt log03.txt ...

Her log dosyasını ayrı bir rm komutuyla silmek için -n 1 kullanabiliriz

$ find /var/log/ -type f -mtime +7 | xargs -p -n 1 rm

Bu komut da şuna eşdeğer bir işlem yapar:

$ rm log01.txt
$ rm log02.txt
$ rm log03.txt
...

Bu dosyaları başka bir yere taşımak için

$ find /var/log/ -type f -mtime +7 | xargs -I % mv % /backup

Burada xargs, % yerine dosya isimlerini yerleştirir. -I parametresi, gizli -n 1 gibi davranarak aslında mv komutunun her dosya için ayrı ayrı çalıştırılmasını sağlar. Yani şuna eşdeğer bir işlem yapar:

$ mv log01.txt /backup
$ mv log02.txt /backup
$ mv log03.txt /backup
...

Dosya isimlerinde alfanümerik olmayan karakterlerin bulunması durumunda dosya isimlerini null karakteri ile ayırma şansımız var. Hem find komutunun dosya isimlerini null ile ayırt etmesini (-print0), hem de xargs komutunun bu karakterle ayrım yapmasını (-0) söyleyebiliriz:

$ find /var/log/ -type f -mtime +7 -print0 | xargs -0 rm

Paralel işlem yapılması ihtiyacı olan durumlar için xargs'ın -P gibi bir parametresi var.

Hiç yorum yok: