/ Linux'ta xargs Komutu Nasıl Kullanılır

Linux'ta xargs Komutu Nasıl Kullanılır

Bir dizüstü bilgisayarda bir Linux terminal istemi

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

v bir terminal penceresinde

Bu, geçerli dizindeki kabuk betiği dosyalarını listeler.

Bir terminal penceresinde ls çıktısı

Beklendiği gibi tek bir sütun alıyoruz. Eğer içinden geçirirsek xargs ne alıyoruz

ls -1 ./*.sh | xargs

-1 -1. bir terminal penceresinde xargs

Çıktı, terminal penceresine, uzun bir metin akışı olarak yazılır.

Terminal penceresindeki xargs aracılığıyla yayınlanı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

ls * .page | Bir terminal penceresinde xargs wc

Bu ne olur:

  • ls * .page dosyalarını listeler ve listeye xargs.
  • xargs dosya isimlerini iletir wc.
  • wc dosya adlarını, sanki komut satırı parametreleri olarak almış gibi ele alır.

Bir terminal penceresinde wc çıkışı

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

yankı 'bir iki üç' | Bir terminal penceresinde 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.

Bir terminal penceresinde onay isteyen xargs

“Y” ye ve Enter'a bastık. Kullanabiliriz ls dosyaların oluşturulduğunu kontrol etmek için.

ls one two three

Bir terminal penceresinde ls çıktısı

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

bir terminal penceresinde ağaç -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

Bir uçbirim penceresinde cat dizinleri.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.

kedi dizinleri.txt | xargs -I% sh -c 'eko%; Bir terminal penceresinde mkdir% '

Dizinler birer birer listelenir.

terminal penceresinde xargs çıktısı

Kullanabiliriz tree dizinlerin oluşturulduğunu doğrulamak için bir kez daha.

tree -d

bir terminal penceresinde ağaçtan çıktı

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

echo ~ / Yedekler / ~ / Belgeler / sayfa dosyaları / | Bir terminal penceresinde xargs -n 1 cp -v.

Dosyalar bir seferde bir dizin olmak üzere iki dizine kopyalanır. cp Her dosya kopyalama eylemini rapor eder;

Bir terminal penceresinde xargs ve cp çıktıları

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

Bul -sim "* .png" -tipi f -print0 | xargs -0 rm -v -rf bir terminal penceresinde "{}"

Tüm alt dizinler aranır ve arama düzeniyle eşleşen dosyalar silinir.

Terminal penceresinde rm çıkışı

İç İçe Dizinleri Kaldırma

Diyelim ki bir dizi iç içe alt dizini kaldırmak istiyoruz. tree onları görmemize izin verecek.

tree -d

bir terminal penceresinde ağaç -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.

Bul -sim "level_one" -tipi d printo | xargs -o rm -v -rf Bir terminal penceresinde "{}"

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.

bir terminal penceresinde find ve xargs ve rm'den çıktılar

Her dizinin adı kaldırıldıkça basılır. Kontrol edebiliriz tree :

tree -d

bir terminal penceresinde ağaç -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 {}

Bul tipi f-notu - "* .sh" adı -print0 | xargs -0 -I {} rm -v {} bir terminal penceresinde

Kontrol edebiliriz ls. Dizinde kalan tek dosyalar “* .sh” arama düzeniyle eşleşen dosyalardır.

ls -l

bir terminal penceresinde ls'den çıkış

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

./ - name "* .page" -type f -print0 adı | Bir terminal penceresinde xargs -0 -tar -cvzf page_files.tar.gz

Arşiv dosyası oluşturuldukça dosyalar beklendiği gibi listelenir.

Bir terminal penceresinde tar çıkışı

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.