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