Birçok dosyada komut çalıştırma


19

Ben birçok dosya (xyz1, xyz2, tüm yol xyz5025 kadar) ile bir klasör var ve ben çıkışları olarak xyz1.faa, xyz2.faa, vb almak her birinde bir komut dosyası çalıştırmak gerekir.

Tek bir dosya için komut:

./transeq xyz1 xyz1.faa -table 11

Bunu otomatik olarak yapmanın bir yolu var mı? Belki bir yapılacaklar kombo?

Yanıtlar:


32
for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

Bu, geçerli dizinde başlayan ve ilk argüman olarak dosya adına sahip programı, ikinci argüman olarak dosya adını ".faa" ve ardından "-table 11" ile çağıran forher dosyayı yineleyecek basit bir döngüdür. .xyz./transeq


4
Veya tek astar olarak: for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done . Bu tür şeyleri her zaman yazıyorum. Dosya adlarının vb. İstediğiniz şekilde genişletildiğini doğrulamak istiyorsanız, ilk seferden echohemen sonra bir sağa koyun dove ardından kabuk geçmişinize geri dönün ve ikinci kez silin.
Dave Tweed

"$file".faaetkileşimli bir astarın parçası olarak yazmak biraz daha kolaydır ve .faaalıntılanması gereken herhangi bir kabuk metakarakter içermediği için güvenlidir .
Peter Cordes

2
Not olarak, kısmi bir çalışma ile sonuçlanır ve döngüyü yeniden başlatmak isterseniz, xyz*glob da .faa dosyalarını alır. Bash için, shopt -s extglob( reference ) for file in xyz!(*.faa) ...komutunu ve sonra .faa dosyalarını döngüden gönderilmesini engellemek için kullanın .
Jeff Schaller

24

GNU Parallel yüklerseniz bunu paralel olarak yapabilirsiniz:

parallel ./transeq {} {}.faa -table 11 ::: xyz*

CPU yoğun programlıysanız, biraz hızlanmalıdır.


6

bashKomut satırında böyle bir şey yapabilirsiniz :

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

1 ila 5025 arasında bir / satır tamsayıları üretiyoruz, sonra bunları teker teker xargs'a besliyoruz. {} xargs'a besliyoruz.

Eğer küme ayracı genişleme imkanınız {n..m}yoksa,seq bu rakamları üretmek yardımcı programı .

Veya, sayısal nesli her zaman şu yollarla taklit edebilirsiniz:

yes | sed -n =\;5025q | xargs ...

1
Bu çok karmaşık. for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; donedüşünmesi ve yazması çok daha kolaydır. Komutları çalıştırmadan önce yazdırmasını istiyorsanız, tuşunu kullanın set -x.
Peter Cordes

Evet bu doğru, ama OP'nin soruyu formüle etme şekli bana sadece xyz1 adında dosyaların ilgi çektiğini görünüyordu. Bu yüzden xyz * için kullanarak yaparsak, uygun olmayan dosyaları reddetmek için bir yola ihtiyacımız olduğunu düşündüm ... dolayısıyla bu. İdeal olarak OP bir dizindeki tüm dosyaların işlenmesini istiyorsa, neden 1'den 5025'e kadar bir şey getirelim? Sadece öngörülen bir şekilde işlenen tüm dosyaların yeterli olacağını söylemek istiyorum.

1
Yazdığım döngüye bak. Sizinkiyle tam olarak aynı sonucu for i in {1..5025}elde etmek için kullanır . Ayrıca bash yazabilirsiniz , ancak genellikle aralık sözdizimini kullanırım çünkü yazmak daha hızlıdır. for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done{a..b}
Peter Cordes

4

Dosyalarınızı dizinlerin içine serpiştirdiğinizde find komutunu kullanmak yararlıdır

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;

4

Birden fazla çekirdeğe sahip olduğunuzu ve her çağrının geri kalanından bağımsız olarak çalışabileceğini varsayarsak, paralel çalışmalarda oldukça hız kazanırsınız.

Bunu yapmak için nispeten basit bir yolu üzerinden gerçekleştirilir -Pait parametre xargs- örneğin, 4 çekirdek varsa:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

-n 1Söyler xargsher çağrı için listenin dışında sadece bir argüman almaya (varsayılan olarak bol geçerdi) ve-P 4 aynı anda 4 süreçlerini yumurtlamaya söyler - Bir ölür, yenisi kökenli.

IMHO, bu basit durum için GNU paralel kurmanıza gerek yok - xargsyeterlidir.


0

Kullanabilirsiniz xarg

ls | xargs -L 1 -d '\n' your-desired-command

-L 1 nedenleri bir seferde 1 öğeyi geçmek

-d '\n'yapmak çıkış lsyeni satır dayalı bölünmüş '.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.