bash
  • scripting
  • expansion
  • 2011-01-14 33 views 21 likes 
    21

    Bir bash komut dosyası içinden, komut satırınaBash değişkenlerde joker karakterleri nasıl genişletir?

    mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/ 
    

    yazarak aynı etkiye ulaşmak çalışıyorum. Ben:

    MYDIR="./images" 
    OTHERDIR="./images/junk" 
    SUFFIXES='{pdf,eps,jpg,svg}' 
    mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/" 
    

    hangi çalıştırdığınızda, değil beklenmeyen bir hata veriyor:

    mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
    No such file or directory 
    

    tüm bu alıntı doğru yolu nedir mv istenen genişleme yapmak aslında böylece? (Evet, ./images/ yılında kalıpla eşleşen dosyaların bol.)

    cevap

    22

    Silinmiş bir yanıt doğru yoldaydı. senin girişimine biraz modifikasyon:

    shopt -s extglob 
    MYDIR="./images" 
    OTHERDIR="./images/junk" 
    SUFFIXES='@(pdf|eps|jpg|svg)' 
    mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/" 
    

    Brace genişleme değişken genişleme önce yapılır, ancak değişken genişleme dosyayolu önce yapılır. Böylece, değişken, orijinalinizde genişletildiğinde, parantez hala sabittir, ancak değişken bunun yerine yol adı öğeleri içerdiğinde, yol adı genişletme işlemi tamamlandığında zaten genişletilmişlerdir. Uyarılar için

    +3

    +1, null trick, '@()' hakkında bilmiyordum, yeni bir şey öğrendim. Sadece manpage'de, “?”, “Desenler”, “*()” kalıpları, '+()' desenleri, '@()' desenleri ve '!()' Desenleri olduğunu merak eden herkese baktım. Tüm extglob etkinse kullanılabilir. – falstro

    +0

    Parlak, teşekkürler! Kabuk betiklerinde alıntılama ve genişleme her zaman bana sorunlara neden olur, bu çok yardımcı olacaktır. –

    +1

    @RossDuncan, http://mywiki.wooledge.org/BashParser'i, kabuğun yürütme modelinde yer alan aşamalarla ilgili iyi bir başvuru için başlayacak bir yer olarak ve hangi sırada gerçekleştiklerini öneririm. –

    5

    Sen işe yaraması için şöyle sırayla o çizgiyi eval gerekir:

    MYDIR="./images" 
    OTHERDIR="./images/junk" 
    SUFFIXES='{pdf,eps,jpg,svg}' 
    eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\"" 
    

    Şimdi, bu sorunları vardır Özellikle, $SUFFIXES'a güvenmiyorsanız, bir enjeksiyon saldırısı içerebilir, ancak bu basit durumda, iyi olmalıdır.

    Diğer çözümlere açık iseniz, find ve xargs ile deneme yapmak isteyebilirsiniz.

    +1

    +1. 'eval' kötülüktür. – l0b0

    İlgili konular