Komutu birden çok dosyada nasıl çalıştırırım


13

Bu oldukça basit, JS dosyaları birkaç alt klasörleri olan bir klasör var ve ben bu klasörlerde tüm dosyaların Google'ın Clojure derleyicisini çalıştırmak istiyorum. Tek bir dosyayı işleme alma komutu aşağıdaki gibidir:

java -jar compiler.jar --js filename.js --js_output_file newfilename.js

Bunu dizin yapımdaki her JS dosyasında çalışacak şekilde nasıl değiştirebilirim?

Yanıtlar:


14

Şunları kullanabilirsiniz find:

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;

Teşekkürler ve orijinal JS dosyalarının üzerine yazılması gerektiğinden muhtemelen her şeyi yeniden adlandırmak için bu kaldıraçtan yararlanabilirsiniz
Mataniko

--Js ve --js_output_file dosyalarının farklı olması gerektiğinde, dosya adını parametre olarak alan, geçici dosyaya çıktıyı ve mvdosyayı orijinal ada yazacak iki satırlı bir komut dosyası yaparım .
Anthon

Ayrı bir komut dosyası oluşturmaktan kaçınmak istiyorsanız find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; donehile yapmalısınız.
David Baggerman

find -execbasit komutlar için harikadır. karmaşık olanlar find | xargsiçin çok daha iyidir ve ayrıca komutları paralel olarak çalıştırmaya izin verir.
acele

@rush belki neden xargsdaha iyi olduğunu açıklayabilir ?
Mel Boyce

7

forÖzellikle dosyalar tek bir dizin içindeyse (alt dizin yok) basit bir döngü de kullanabilirsiniz . Alt dizinlerle de çalışacak şekilde değiştirilebilir.

Özyineleme olmadan:

for filename in ./*.js
do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

veya eşdeğer bir astar olarak:

for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done

Alt dizinlere geri almak için (GNU bash 4.0 veya daha yeni bir sürümü gerektirir) (teşekkürler @ChrisDown ):

shopt -s globstar
for filename in ./**/*.js; do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

1
Bu, soruda sorulduğu gibi alt dizinleri geri çekmez. Bash4 + globstarile bunu yapmak için kullanabilirsiniz .
Chris Down

1
Evet, bu iyi bir cevap ve bilmek harika, ama diğer cevap tam olarak ihtiyacım olan şeyi yapıyor.
Mataniko

1
Ohh, "birkaç alt klasörü" kısmını tamamen özledim. Afedersiniz. Ancak cevabı bütünlük uğruna bırakmak.
CVn

3
@rush **İsteğe bağlı bir özyineleme düzeyiyle eşleşebildiğinden , **/*.jsçalışır: sprunge.us/PXQK
Chris Down

1
Genellikle for f in ./*.js; doveya for f in ./**/*.js; doile başlayan dosya adlarından korunmak için iyi bir fikirdir -(bu durumda bunun gerekli olup olmadığını bilmiyorum, ama yine de iyi bir alışkanlık).
evilsoup
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.