Bazı Linux komutlarını bir araya getirmeniz gerekiyor, ancak bunlardan biri piped girişi kabul etmiyor mu? xargs
çıktıyı bir komuttan alabilir ve parametre olarak başka bir komuta gönderebilirsiniz.
Tüm standart Linux yardımcı programlarının üçü vardır.bunlarla ilişkili veri akışları. Bunlar standart giriş akışı (stdin), standart çıkış akışı (stdout) ve standart hata akışıdır (stderr).
Bu akışlar metinle çalışır. Girdiyi (stdin) metin kullanarak bir komuta göndeririz ve cevap (stdout) terminal penceresine metin olarak yazılır. Hata mesajları ayrıca terminal penceresine metin olarak da yazılır (stderr).
Linux ve Unix benzeri harika özelliklerden biriişletim sistemleri stdout çıkışını bir komuttan ikinci bir komutun stdin girişine yöneltme yeteneğidir. İlk komut, çıktısının bir terminal penceresine gitmemesi umrunda değil ve ikinci komut, girişinin bir klavyeden gelmemesine aldırmıyor.
Tüm Linux komutları üç standart akışa sahip olsalar da, hepsi başka bir komutun stdout'unu kendi std'lerinin girişi olarak kabul etmiyorlar. Bu, onlara giriş yapamayacağınız anlamına gelir.
xargs
standart veri akışlarını kullanarak yürütme boru hatları oluşturmak için kullanılan bir komuttur. Kullanarak xargs
gibi komutlar yapabiliriz echo
, rm
, ve mkdir
standart girdiyi argümanlar olarak kabul et.
Xargs Komutanlığı
xargs
boru girişini kabul edecektir. Ayrıca bir dosyadan girdi kabul edebilir. xargs
bu girişi, çalışmamızı söylediğimiz komutlar için parametre olarak kullanır. Söylemezsek xargs
belirli bir komutla çalışmak için kullanmak varsayılan echo
.
Bunu nasıl olduğunu göstermek için kullanabiliriz. xargs
Çok satırlı girişten bile her zaman tek bir çıktı satırı oluşturur.
Kullanırsak -1
(satır başına bir dosya listeleme) seçeneği ls
, tek bir dosya adı sütunu alıyoruz.
ls -1 ./*.sh
Bu, geçerli dizindeki kabuk betiği dosyalarını listeler.
Beklendiği gibi tek bir sütun alıyoruz. Eğer içinden geçirirsek xargs
ne alıyoruz
ls -1 ./*.sh | xargs
Çıktı, terminal penceresine, uzun bir metin akışı olarak yazılır.
Bu yetenek xargs
parametreleri diğer komutlara besleyin.
Wc ile xargs kullanma
Kullanabiliriz xargs
kolayca sahip olmak wc
kelimeleri, karakterleri ve satırları birden fazla dosyada sayar.
ls *.page | xargs wc
Bu ne olur:
ls
* .page dosyalarını listeler ve listeyexargs
.xargs
dosya isimlerini iletirwc
.wc
dosya adlarını, sanki komut satırı parametreleri olarak almış gibi ele alır.
Her bir dosyanın istatistikleri, toplam bir toplamla birlikte görüntülenir.
Onay ile xargs kullanma
Kullanabiliriz -p
(etkileşimli) seçeneğinin olması xargs
ilerlememizden memnun olduğumuzu teyit etmemizi isteyin.
Eğer bir dosya ismini iletirsek: touch
, vasıtasıyla xargs
, touch
bizim için dosyaları yaratacaktır.
echo 'one two three' | xargs -p touch
Yürütülecek komut görüntülenir ve xargs
“y” veya “Y” veya “n” veya “N” yazıp Enter tuşuna basarak yanıt vermemizi bekler.
Sadece Enter tuşuna basarsanız, “n” olarak kabul edilir. Komut yalnızca “y” veya “Y” yazarsanız uygulanır.
“Y” ye ve Enter'a bastık. Kullanabiliriz ls
dosyaların oluşturulduğunu kontrol etmek için.
ls one two three
Xargs'i Çoklu Komutlarla Kullanma
İle birden fazla komut kullanabiliriz. xargs
kullanarak -I
(ilk argümanlar) seçeneği.
Bu seçenek bir "değiştirme dizesi" tanımlar. Değiştirilen dizenin belirteci komut satırında göründüğü yerlere, xargs
eklenir.
Kullanalım tree
geçerli dizindeki alt dizinlere bakmak için komut. -d
(dizin) seçeneği neden olur tree
dosyaları yoksaymak ve yalnızca dizinleri raporlamak için.
tree -d
“Görüntüler” adında tek bir alt dizin var.
“Directories.txt” adlı bir dosyada, oluşturmak istediğimiz bazı dizinlerin isimlerine sahibiz. Kullanarak içeriğine bakabiliriz cat
.
cat directories.txt
Bunu için giriş verileri olarak kullanacağız. xargs
. Gideceğimiz komut şudur:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
Bu böyle bozulur:
- kedi dizinleri.txt |: Bu, directrories.txt dosyasının içeriğini (tüm yeni dizin adlarını) içine iter
xargs
. - xargs -I%: Bu, “%” belirteciyle birlikte “string” i tanımlar.
- sh -c: Bu yeni bir alt kabuk başlatır.
-c
(command) kabuğa komut satırından komut okumasını söyler. - 'Eko %; mkdir% ': “%” belirteçlerinin her biri, geçtiği dizin adları ile değiştirilecektir
xargs
.echo
komut dizin adını yazdıracak;mkdir
komut dizini yaratacaktır.
Dizinler birer birer listelenir.
Kullanabiliriz tree
dizinlerin oluşturulduğunu doğrulamak için bir kez daha.
tree -d
Dosyaları Birden Çok Yere Kopyalama
Kullanabiliriz xargs
dosyaları tek bir komutla birden fazla konuma kopyalamamızı sağlar.
İki dizinin isimlerini borulara aktaracağız. xargs
giriş parametreleri olarak. Anlatacağız xargs
aynı anda bu parametrelerden birini çalıştığı komuta geçirmek.
Bu durumda, komut cp
. Yani etkisi aramaktır. cp
iki kez, her seferinde iki dizinten biri ile komut satırı parametresi olarak. xargs
Bunun olmasını sağlayan parametre -n
(maksimum sayı) seçenek. Bunu bir olarak ayarlayacağız.
Biz de kullanıyoruz -v
(ayrıntılı) seçeneği ile cp
Böylece ne olduğunu bildirir.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
Dosyalar bir seferde bir dizin olmak üzere iki dizine kopyalanır. cp
Her dosya kopyalama eylemini rapor eder;
İç İçe Dizinlerdeki Dosyaları Silme
Dosya adlarında boşluk ve tuhaf karakterler varsa - örneğin yeni satır karakterleri gibi - xargs
bunları doğru şekilde yorumlayamaz. -0 (null terminator) seçeneğini kullanarak bu sorunun üstesinden gelebiliriz. Bu söyler xargs
boş karakteri dosya adları için son sınırlayıcı olarak kullanmak için.
Kullanacağız find
bu örnekte. find
dosya adlarında boşluk ve garip karakterler ile ilgilenmek için kendi seçeneğine sahiptir. O -print0
(tam ad, boş karakter) seçeneği.
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
Bu böyle bozulur:
- Bul -sim “* .png”:
find
dosyadaki “* .png” ile eşleşen adları olan nesneler için geçerli dizindeki “.” dizinini arayacak (type -f
). - -print0: isimler boş bir karakterle sonlandırılacak ve boşluklar ve garip karakterler sağlanacak.
- xargs -0: xargs Ayrıca dosya isimlerinin boş bırakılması gerektiğini düşünecek ve boşluklar ve garip karakterler sorun yaratmayacak.
- rm -v -rf “{}”: rm ayrıntılı olacak ve neler olduğunu bildirecek (
-v
). Özyinelemeli (-r) olacak ve iç içe geçmiş alt dizinlere bakacak ve sormadan dosyaları silecektir (-f
). Her bir dosya ismi ile “{}” değiştirilir.
Tüm alt dizinler aranır ve arama düzeniyle eşleşen dosyalar silinir.
İç İçe Dizinleri Kaldırma
Diyelim ki bir dizi iç içe alt dizini kaldırmak istiyoruz. tree
onları görmemize izin verecek.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
Bu komut, geçerli dizinde yinelemeli olarak arama yapmak için find komutunu kullanır. Arama hedefi “level_one” adlı bir dizindir. Dizin isimleri xargs
için rm
.
Bu komut ile önceki komut arasındaki tek önemli değişiklik, arama terimi en üstteki dizinin adı ve -type d
anlatır find
dizinleri aramak, dosyaları değil.
Her dizinin adı kaldırıldıkça basılır. Kontrol edebiliriz tree
:
tree -d
İç içe geçmiş alt dizinlerin tümü silinir.
Bir Dosya Türü Dışında Tüm Dosyaları Silme
Kullanabiliriz find
, xargs
ve rm
tek bir tür dışındaki tüm dosyaları silmek için saklamak istiyoruz. Biraz sezgiseldir, ancak istediğimiz dosya türünün adını veriyoruz Tut, silmek istediklerimizin adını değil.
Bu -not
seçenek söyler find
dosyaların isimlerini döndürmek yapamaz arama düzeniyle eşleşin. Kullanıyoruz -I
(ilk argümanlar) seçeneği ile xargs
bir kez daha. Bu kez tanımlayacağımız change string simgesi “{}” olur. Bu, daha önce ürettiğimiz change-string token ile aynı şekilde davranacak ve bu “%” oldu.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
Kontrol edebiliriz ls
. Dizinde kalan tek dosyalar “* .sh” arama düzeniyle eşleşen dosyalardır.
ls -l
Xargs ile bir Arşiv Dosyası Oluşturma
Kullanabiliriz find
dosyaları aramak ve onları iletmek için xargs
için tar
, bir arşiv dosyası oluşturmak için.
Geçerli dizinde arama yapacağız. Arama düzeni “* .page” olduğundan “.page” dosyalarını arayacağız.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
Arşiv dosyası oluşturuldukça dosyalar beklendiği gibi listelenir.
Veri Aracısı
Bazen bir şeyleri üst üste koyarken küçük bir iskeleye ihtiyaç duyarsınız. xargs
bilgi pompalayabilen komutlar ve almak için oluşturulmuş olmayan komutlar arasındaki boşluğu kapatır.
Her ikisi de xargs
ve find
çok sayıda seçenek var. Daha fazla bilgi için kılavuz sayfalarına göz atmanız önerilir.