SORU
18 Ocak 2011, Salı


Bash kullanarak, nasıl bir sınıf tüm dosyaları bir dizin kazanıyorsun

Bu bir olacakgerçektenbash bir guru için basit freebie:

Soru

Bash kullanarak, nasıl bir sınıf tüm dosyaları bir dizin kazanıyorsun?


Ayrıntılar

Bir dizin verildi:

LIB=/path/to/project/dir/lib

hiçbir şey ama *içerir.jar gibi dosyaları:

junit-4.8.1.jar
jurt-3.2.1.jar
log4j-1.2.16.jar
mockito-all-1.8.5.jar

Virgülle ayrılan şeklinde sınıf değişken: bir oluşturmak için ihtiyacım var

CLASSPATH=/path/to/project/dir/lib/junit-4.8.1.jar:/path/to/project/dir/lib/jurt-3.2.1.jar:/path/to/project/dir/lib/log4j-1.2.16.jar:/path/to/project/dir/lib/mockito-all-1.8.5.jar

Neredeyse aradığım mantık ifade eden bazı seudo-kod çizgisinde olacaktır:

for( each file in directory ) {
   classpath = classpath   ":"   LIB   file.name
}

Bir şeydirbasitbash script ile bunu yapmak için bir yol?

CEVAP
18 Ocak 2011, Salı


Yeni Cevap
(Ekim 2012)

El ile sınıf listesi oluşturmanıza gerek yok. Java dizinler için uygun bir joker sözdizimi jar dosyaları içeren destekler.

java -cp "$LIB/*"

(* dikkat ediniçindetırnak işaretleri.)

man java açıklama:

Özel bir kolaylık, bir sınıf yolu unsuru içeren bir basename * olduğunu kabul eşdeğer belirten bir liste tüm dosyaları dizin ile uzantısı .jar .JAR (bir java programı söyleyemez arasındaki fark iki çağırmaları).

Örneğin, dizin foo içerir a.jar b.JAR, sınıfın yolunu elemanı foo/* genişletilmiş bir A.jar:b.JAR hariç sipariş jar dosyalarını olduğu belirtilmemiş. Belirtilen dizin, gizli olanlar da dahil, tüm jar dosyaları listeye dahil edilir. Sınıf girişi * sadece oluşan geçerli dizindeki tüm jar dosyalarının bir listesi için genişler. Tanımladığı CLASSPATH ortam değişkeni, benzer şekilde genişletilmiş olacak. Herhangi bir sınıf joker genişleme Java sanal makinesi başladı-önce oluşur; hayır Java programı hiç unexpanded joker dışında çevre sorgulayarak göreceksiniz.


Eski Cevap

İyi

Basit ama mükemmel bir çözüm değil

CLASSPATH=$(echo "$LIB"/*.jar | tr ' ' ':')

Bu boşluk içeren dosya isimleri düzgün ele değil, bu ufak bir kusur var. Eğer bu konularda ise biraz daha karmaşık bu sürümü deneyin:

Daha iyi

CLASSPATH=$(find "$LIB" -name '*.jar' -printf '%p:' | sed 's/:$//')

Bu sadece komut destekler bulmaya çalışır -printf (GNU olarak find).

Eğer Mac OS X gibi find, GNU yok eğer doğru değilse, xargs yerine kullanabilirsiniz:

CLASSPATH=$(find "." -name '*.jar' | xargs echo | tr ' ' ':')

En iyi?

(Garip) bunu yapmak için başka bir yol alan ayırıcı $IFS değişken değiştirmek için. Bu tuhaf görünümlü çok ama çok iyi Tüm dosya adları ve kullandığı shell built-ins ile davranır.

CLASSPATH=$(JARS=("$LIB"/*.jar); IFS=:; echo "${JARS[*]}")

Açıklama:

  1. JARS dosya adları bir dizi için ayarlanır.
  2. IFS : değiştirilir.
  3. Dizi yankılandı ve $IFS dizi girdileri arasında ayırıcı olarak kullanılır. Dosya adları anlam aralarında iki nokta üst üste ile yazdırılır.

Tüm bu alt-kabuk yapılır $IFS değişim kalıcı baaaad olacaktı) değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Marissah Simonini

    Marissah Sim

    25 HAZİRAN 2013
  • ShayLoss

    ShayLoss

    5 Kasım 2009
  • UKF Dubstep

    UKF Dubstep

    29 NİSAN 2009