Xargs - Xargs

xargs
Geliştirici (ler)Çeşitli açık kaynak ve ticari geliştiriciler
İşletim sistemiUnix, Unix benzeri, IBM i
PlatformÇapraz platform
TürKomut

xargs ("eXtended ARGuments" için kısa [1]) bir komut açık Unix ve en Unix benzeri işletim sistemleri komutları oluşturmak ve yürütmek için kullanılır standart girdi. Standart girdiden gelen girdiyi bir komuta dönüştürür.

Gibi bazı komutlar grep ve awk girdiyi komut satırı bağımsız değişkenleri olarak veya standart girdiden alabilir. Ancak diğerleri gibi cp ve Eko yalnızca argüman olarak girdi alabilir, bu yüzden xargs gerekli.

xargs komut aynı zamanda IBM i işletim sistemi.[2]

Örnekler

Bir kullanım durumu xargs komutu, bir dosya listesini kaldırmaktır. rm komut. POSIX sistemlerinde bir ARG_MAX komut satırının maksimum toplam uzunluğu için,[3][4] bu nedenle komut, "Bağımsız değişken listesi çok uzun" hata mesajıyla başarısız olabilir (bu, exec sistem çağrısının bir komut satırı uzunluğu sınırının aşıldığı anlamına gelir): rm / yol / * veya rm $(bul / yol-türü f). (İkinci çağrı, çıktıdaki globları genişletebileceği için yanlıştır.)

Bu, kullanılarak yeniden yazılabilir. xargs argümanlar listesini kabul edilebilecek kadar küçük alt listelere bölme komutu:

bul / yol-türü f -print | xargs rm

Yukarıdaki örnekte, bulmak Yarar girdisini besler xargs uzun bir dosya adı listesi ile. xargs daha sonra bu listeyi alt listelere ve çağrılara böler rm her alt liste için bir kez.

xargs işlemleri ile paralelleştirmek için de kullanılabilir -P maxprocs komutları girdi bağımsız değişken listeleri üzerinden yürütmek için kaç paralel işlemin kullanılması gerektiğini belirtmek için bağımsız değişken. Ancak çıktı akışları senkronize edilmeyebilir. Bu, bir kullanarak aşılabilir --çıktı dosyası mümkünse argüman ve ardından işlendikten sonra sonuçları birleştirerek. Aşağıdaki örnek 24 işlemi sıraya koyar ve bir başkasını başlatmadan önce her birinin bitmesini bekler.

bul / yol-adı "* .foo" | xargs -P 24 -BEN '{}' / cpu / bağlı / işlem '{}''{}'.dışarı

xargs genellikle aynı işlevselliği kapsar komut ikamesi birçok özelliği kabuklar ile gösterilir geri alıntı gösterim (`...` veya $(...)). xargs aynı zamanda uzun dosya listeleri çıkaran komutlar için de iyi bir arkadaştır. bulmak, bulmak ve grep, ancak yalnızca biri kullanırsa -0 (Veya eşdeğer olarak --boş), dan beri xargs olmadan -0 içeren dosya adlarıyla kötü anlaşıyor ', " ve boşluk. GNU Paralel ile daha iyi uyumluluk sunan benzer bir araçtır bulmak, bulmak ve grep dosya adları ne zaman içerebilir ', "ve boşluk (satırsonu hala gerektirir -0).

Argümanların yerleştirilmesi

-Ben seçeneği: tek argüman

xargs komutu, listelenen bağımsız değişkenleri komut satırının sonu dışındaki bir konuma ekleme seçenekleri sunar. -BEN seçeneği xargs komut yürütülmeden önce sağlanan girdi ile değiştirilecek bir dizge alır. Ortak bir seçim %.

$ mkdir ~ / backups$ bul / yol-türü f-adı '*~' -print0 | xargs -0 -I% cp -a% ~ / yedekler

Değiştirilecek dize, komut bölümünde birden çok kez görünebilir. Kullanma -BEN her seferinde kullanılan satır sayısını bir ile sınırlar.

Kabuk numarası: herhangi bir numara

Benzer bir etki elde etmenin başka bir yolu, başlatılan komut olarak bir kabuk kullanmak ve bu kabuktaki karmaşıklıkla ilgilenmektir, örneğin:

$ mkdir ~ / backups$ bul / yol-türü f-adı '*~' -print0 | xargs -0 sh -c 'dosya adı için; cp -a "$ dosya adı" ~ / backups; bitti ' sh

Kelime sh satırın sonunda POSIX kabuğu sh -c doldurmak için $0, konumsal parametrelerin (argv) "yürütülebilir adı" kısmı. Mevcut olmasaydı, ilk eşleşen dosyanın adı yerine atanırdı. $0 ve dosya kopyalanmaz ~ / backups. O boşluğu doldurmak için başka herhangi bir kelime de kullanılabilir, benim-xargs-komut dosyası Örneğin.

Dan beri cp aynı anda birden fazla dosyayı kabul ederse, aşağıdakileri de yapabilirsiniz:

$ bul / yol-türü f-adı '*~' -print0 | xargs -0 sh -c 'eğer [$ # -gt 0]; sonra cp -a "$ @" ~ / backup; fi ' sh

Bu komut dosyası çalışır cp iletilen herhangi bir argüman olduğunda kendisine verilen tüm dosyalar ile. Bunu yapmak daha etkilidir çünkü yalnızca bir çağrı cp her çağrı için yapılır sh.

Ayırıcı sorunu

Birçok Unix uygulaması hat odaklıdır. Bunlar ile çalışabilir xargs satırlar içermediği sürece ', "veya bir boşluk. Unix yardımcı programlarından bazıları kullanabilir NUL kayıt ayırıcı olarak (ör. Perl (gerektirir -0 ve \0 onun yerine n), bulmak (kullanılması gerektirir -0), bulmak (kullanılması gerektirir -print0), grep (gerektirir -z veya -Z), çeşit (kullanılması gerektirir -z)). Kullanma -0 için xargs sorunla ilgilenir, ancak birçok Unix yardımcı programı ayırıcı olarak NUL kullanamaz (ör. baş, kuyruk, ls, Eko, sed, katran -v, wc, hangi).

Ancak çoğu zaman insanlar bunu unutur ve xargs aynı zamanda hat odaklıdır, bu da değil durum (varsayılan olarak xargs yeni satırlarda ayırır ve satırlar içindeki boşluklar, boşluklu alt dizeler tek veya çift tırnaklı olmalıdır).

Ayırıcı sorunu burada gösterilmektedir:

# Pratik yapmak için bazı hedefler belirleyinönemli_dosyaya dokunun "önemli değil_dosya"mkdir -p "12 kayıt"bul. -name değil\* | kuyruk -1 | xargs rmfind \! -isim. -tip d | kuyruk -1 | xargs rmdir

Yukarıdakileri çalıştırmak önemli_dosya kaldırılacak, ancak aranan dizini kaldırmayacak 12 "kayıtne de dosya aradı önemli değil_dosya.

Doğru düzeltme, GNU'ya özgü -print0 seçenek, ama kuyruk (ve diğer araçlar) NUL ile sonlandırılmış dizeleri desteklemez:

# yukarıdakiyle aynı hazırlık komutlarını kullanınbul. -name değil\* -print0 | xargs -0 rmfind \! -isim. -tip d -print0 | xargs -0 rmdir

Kullanırken -print0 seçenek, girişler satır sonu yerine boş karakterle ayrılır. Bu, daha ayrıntılı komuta eşdeğerdir:bul. -name değil\* | tr \\n \\0 | xargs -0 rm veya daha kısa, geçiş yaparak xargs to (POSIX olmayan) hat odaklı mod ile -d (sınırlayıcı) seçeneği: bul. -name değil\* | xargs -d ' n' rm

ama genel olarak kullanıyor -0 ile -print0 dosya adlarındaki satırsonları hala sorun olduğu için tercih edilmelidir.

GNU paralel bir alternatiftir xargs aynı seçeneklere sahip olacak şekilde tasarlanmış, ancak hat odaklı. Dolayısıyla, bunun yerine GNU Paralel kullanıldığında, yukarıdakiler beklendiği gibi çalışacaktır.[5]

Unix ortamları için xargs desteklemiyor -0 ne de -d seçenek (örneğin Solaris, AIX), POSIX standardı, her karakterin ters eğik çizgiden kaçabileceğini belirtir:bul. -name değil\* | sed 's / (. ) / 1 / g' | xargs rm.[6] Alternatif olarak, GNU paralel kullanarak veya GNU kullanarak xargs kullanmaktan da kaçınılabilir. -exec ... + işlevselliği bulmak.

Aynı anda bir bağımsız değişken alt kümesi üzerinde işlem yapma

Bir seferde yalnızca bir veya belki iki argüman kabul edebilen komutlarla uğraşıyor olabilir. Örneğin, fark komutu aynı anda iki dosya üzerinde çalışır. -n seçeneği xargs verilen komuta bir seferde kaç argüman sağlanacağını belirtir. Komut, tüm girişler tükenene kadar tekrar tekrar çağrılacaktır. Yeterli girdi yoksa, son çağrıda istenen argüman sayısından daha azının elde edilebileceğini unutmayın. Kullanım xargs girdiyi satır başına iki bağımsız değişkene bölmek için:

$ Eko {0..9} | xargs -n 20 12 34 56 78 9

Bir seferde belirli sayıda argümana göre çalışmaya ek olarak, her girdi satırı için bir komut da kullanılabilir. -L 1 seçeneği. Bir seferde rastgele sayıda satır kullanılabilir, ancak bunlardan biri en yaygın olanıdır. İşte nasıl olabilir fark her git, ebeveynine karşı.[7]

$ git log - biçim="% H% P" | xargs -L 1 git fark

Kodlama sorunu

Bağımsız değişken ayırıcı işlemi xargs kullanımı ile ilgili tek sorun değil xargs programı varsayılan modunda. Genellikle dosya adlarını değiştirmek için kullanılan çoğu Unix aracı (örneğin sed, baz adı, çeşit, vb.) metin işleme araçlarıdır. Bununla birlikte, Unix yol adları gerçekte metin değildir. Bir yol adı / aaa / bbb / ccc düşünün. / Aaa dizini ve bbb alt dizini genel olarak farklı ortamlara sahip farklı kullanıcılar tarafından oluşturulabilir. Bu, bu kullanıcıların farklı bir yerel ayarlara sahip olabileceği anlamına gelir ve bu, aaa ve bbb'nin aynı karakter kodlamasına sahip olmak zorunda bile olmadığı anlamına gelir. Örneğin, aaa Shift JIS'de UTF-8 ve bbb olabilir. Sonuç olarak, bir Unix sistemindeki mutlak bir yol adı, tek bir karakter kodlaması altında metin olarak doğru şekilde işlenemeyebilir. Girdilerinin metin olmasına dayanan araçlar bu tür dizelerde başarısız olabilir.

Bu sorun için bir geçici çözüm, bu tür araçları, esas olarak girdinin baytlarını olduğu gibi işleyen C yerel ayarında çalıştırmaktır. Bununla birlikte, bu, araçların davranışını kullanıcının beklemeyeceği şekillerde değiştirecektir (örneğin, kullanıcının büyük / küçük harf katlama davranışıyla ilgili beklentilerinin bir kısmı karşılanmayabilir).

Referanslar

  1. ^ "Unix Kısaltma Listesi: Tam Liste". www.roesler-ac.de. Alındı 2020-04-12.
  2. ^ IBM. "IBM System i Sürüm 7.2 Programlama Qshell" (PDF). Alındı 2020-09-05.
  3. ^ "GNU Core Utilities ile Sık Sorulan Sorular". Alındı 7 Aralık 2015.
  4. ^ "Yeni bir işlem için maksimum argüman uzunluğu". www.in-ulm.de.
  5. ^ Xargs ve GNU Parallel arasındaki farklar. GNU.org. Şubat 2012 erişildi.
  6. ^ xargs - Komutlar ve Yardımcı Programlar Referansı, Tek UNIX Spesifikasyonu, Sayı 7 Açık Grup
  7. ^ Cosmin Stejerean. "Xarjlar hakkında (muhtemelen) bilmediğiniz şeyler". Alındı 7 Aralık 2015.

Dış bağlantılar

Kılavuz sayfaları