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