xargs Komutu ve Kullanımı

xargs bir kez alıştığınızda sürekli kullanacağınız, özellikle script yazımında işinizi oldukça pratik hale getirecek komutlardan biri.

AA

Fonksiyon olarak öncesinde kullanılan komutun çıktısını bir sonraki komuta iletme işlemini sağlayan xargs pipe kullanımıyla da özdeş kabul edilebilir. Ancak işlevsel farklılıkları nedeniyle kullanım ihtiyaçlarına göre değerlendirilmeleri gerekir. Bir örnekle anlatmak gerekirse;

echo 1 2 3 | xargs echo "Sayılar:"

Yukarıdaki komut pipe öncesinde echo ile yazdırdığımız 1, 2, 3 sayısını başında Sayılar: olacak şekilde sunacaktır1. Kod içerisindeki xargs kaldırıldığında alacağımız dönüş sadece Sayılar olacaktır. Tarih üzerinden örneği yeniden kurgulayalım:

date | xargs echo "Tarih:"

Tekrar sayılara dönelim ve echo ile belirttiğimiz sayıların satırlar halinde döndürüleceği bir komut uygulayalım.

echo 1 2 3 | xargs -n 1

Şimdi de örnek içerisinde echo ile belirtilen sayıların toplamını alalım.

echo 1 2 3 | xargs | tr ' ' '+' | bc -l

Yoğunlukla script içerisinde kullanımlarına denk gelebileceğiniz xargs find ile dosya işlemleri konusunda hızlı çözümler (isim değiştirme, silme, yetki düzenleme vs.) sunabilmektedir. birkaç örnekle konuyu detaylandıralım.

İlk örneğimiz *.log uzantılı dosyalar içerisinde, içeriğinde belirttiğimiz kelimenin geçtiği satırları listelemek olsun.

find . -name '*.log' | xargs grep 'Salary'

Yukarıdaki örneği biraz değiştirelim ve bu defa klasör içeriğindeki *.log uzantılı dosyaların silinmesini sağlayalım. Silme işleminin dikkatli bir şekilde kullanılması gerektiğini unutmayın.

find . -name "*.log" | xargs rm -rf

Örnekleri birlikte değerlendirerek içeriğinde belirli bir kelimenin geçtiği dosyaları silebilirsiniz. Find ile ilgili yetkilendirmelerden bahsettiğim kullanıcı erişimi ve yetki aramaları başlıklı yazıda da yer verdiği -mtime ile arama-silme işlemini zaman sınırlandırması içerisinde gerçekleştirebilirsiniz.

find . -mtime +10 | xargs rm

Silme işleminin spesifik olarak find komutuyla kullanılabileceği gibi bir kural olduğunu düşünmemeniz adına alternatif kullanımlara da değinmek istiyorum. İlk komutumuz bulunulan dizindeki tüm dosya ve klasörleri silecektir.

ls | xargs rm -rf

Bir diğer komutumuz ise dosyaları listeleyip, adında “apache” geçen dosyaları silecektir.

ls | grep "apache" | xargs rm

Peki, silme işleminin doğru bir şekilde gerçekleştiğinden nasıl emin olacaksınız? -p opsiyonu ile son örneğimiz üzerinden bir işlem gerçekleştirelim o halde.

ls | grep "apache" | xargs -p rm

Yukarıdaki komut belirtilen argümanla eşleşen durumlar için her defasında onay (y/yes) isteyerek ilerleyecektir. Daha kapsamlı ve döngüsel işlemler için saurorja.org > Basic Mathematics from shell command line yazısını inceleyebilir2, detaylı kullanıma dair bilgiler için man xargs komutunu kullanabilirsiniz.