28/02/2022

xargs

Normalde xargs komutu bir input u diğer bir komuta gönderir. Ancak bunu normalde pipe ile yaparız fakat bazı komutlar pipe ile input almazlar o durumda xargs kullanırız.

komut1 | xargs komut2

Örneğin echo pipe ile input almaz.

[root@localhost ~]# seq 5
1
2
3
4
5
[root@localhost ~]# seq 5 |xargs echo
1 2 3 4 5

xargs eğer hiç bir argüman almaz ise otomatik echo ile çalışır

[root@localhost ~]# seq 5 |xargs
1 2 3 4 5

xargs ile neyi nereye gönderdiğimizi test edebiliriz.

[root@localhost ~]# seq 5 |xargs -t
echo 1 2 3 4 5
1 2 3 4 5

Böylece echo komutuna 1 2 3 4 5 i argüman olarak gönderdiğimizi ve altında da bunun çıktısını görebiliyoruz.

Placeholder

-I ile bir place holder oluştururuz ve bunu istediğimiz yerde kullanırız.

ls çıktısını pipe ile yantarafa alıyoruz ve onu “+” place holderının olduğu yerde kullanıyoruz.

[root@localhost ~]# ls | xargs -I + echo "/Can/+"
/Can/anaconda-ks.cfg
/Can/aws
/Can/awscliv2.zip
/Can/vst_install_backups
/Can/vst-install-rhel.sh
/Can/vst-install.sh

/Can diye bir klasör yok ama echo “” arasında gördüğü texti yazıyor + da place holderdı.

[root@localhost xargs]# seq 1000 | xargs -I {} touch {}.txt

1000 adet #.txt dosyası oluşturduk.

HIZ

Xargs hızlıdır.

[root@localhost xargs]# time find . -type f -name "*.text" -exec rm {} \;

real    0m0.769s
user    0m0.368s
sys     0m0.376s
[root@localhost xargs]# seq 1000 | xargs -I {} touch {}.text
[root@localhost xargs]# time find . -type f -name "*.text" | xargs rm

real    0m0.022s
user    0m0.003s
sys     0m0.019s

Leave a Reply