2016-09-01 21 views
5

Benim komut dosyası: dizindeMantıksal VEYA benim kabuk komut

#!/bin/bash 

for file in *.ats; 
do 
    if [[ ("${file}" = THx) || ("${file}" = THy)]] 
    then cp $file /home/milenko/procmt 
    fi 
done 

Dosyalar istediğim ne

262_V01_C00_R000_TEx_BL_128H.ats 
262_V01_C01_R000_TEy_BL_128H.ats 
262_V01_C02_R000_THx_BL_128H.ats 
262_V01_C03_R000_THy_BL_128H.ats 

THX veya THY içeren dosyaları kopyalamak için, ama dosyalar kopyalanmaz. Neden?

for file in *.ats; do 
    if [[ $file == *TH[xy]* ]]; then 
     cp "$file" /home/milenko/procmt 
    fi 
done 
+1

'cp * _TH [xy] _ *. Ats/home/milenk/procmt /'? Bir döngüye sahip olmanın hiçbir anlamı yok. –

cevap

4

Genişletilmiş globbing için extglob'u kullanma hakkında ne düşünüyorsunuz? Kullanmak Bu şekilde for kendisi gerekli uzantıları almak için:

shopt -s extglob 
for file in *TH?(x|y)*.ats; do 
    # do things with "$file" ... 
done 

*TH?(x|y)*.ats

<something> + TH + either x or y + <something> + .ats


bunu bir yazım hatası var çünkü komut başarısız içeren bu dosyalara genişler:

if [[ ("${file}" = THx) || ("${file}" = THy)]] 
#          ^
#        missing space 

Bu sorun güzel:

$ d="hi" 
$ [[ ($d == hi) || ($d == ha) ]] && echo "yes" 
yes 

parantez gereksiz olmasına rağmen:

cp *TH[xy]*.ats /home/milenko/procmt 

Orada sonuçları üzerinden döngü gerek var ve ardından ayrı bir karşılaştırma yapın:

$ [[ $d == hi || $d == ha ]] && echo "yes" 
yes 
+1

'x' ve' y' çokkarakterli dizeleri temsil etmedikçe, '? (X | y)', sıradan desen [xy] 'ye eşdeğerdir. – chepner

4

Sen $fileTHx veya THy olup olmadığını kontrol etme glob yani *TH[xy]* karakter sınıfını kullanabilirsiniz adı, THx veya THy'dir.

5

Sorunuz "THX veya THY içeren dosyalar" belirtir ... ama kod dosyası belirtir:

+2

"* .ats" deseniyle eşleşen dosya adı "THY" veya "THx" olacaktır. – Jdamian

9

ben tamamen burada bir döngü önlemek düşünüyorum ; Tek bir glob, istediğiniz dosya listesine genişleyecektir.

orijinal yaklaşımla sorunların bir çift vardı:

  • Öncelikle, tam eşleşmeler için test etmek çalışıyorlardı, böylece koşul doğru asla.
  • Ayrıca, boşluklarla da dikkat edin: , [[ bileşkesindeki bir anahtar sözcüktür, bu nedenle ayrı bir kelime olması gerekir (yani, boşluklarla çevrili).
+2

Bir uyarı: Bir komut satırına sığabilecek olandan daha fazla eşleşme bekliyorsanız döngü gereklidir. Ayrıca, son derece akılda kalıcı bir notta, '' '* basit * komutunun bir argümanıdır' '' '', '' [[...]] '' anahtar kelimeler kullanılarak bir * bileşik * komuttur [['ve']] '. – chepner

+0

Teşekkürler, ben ifadeyi güncelledik.Yani 'for' döngüsünün uzunluk sınırı, 'cp' komutu için olduğundan daha büyüktür? –

+1

Her iki durumda da, model, kitaplık işlevini genişleten desene kadar geçirilir. Harici bir komut için, 'exec *' ailesindeki bir aramaya geçmek üzere büyük bir argüman listesi oluşturmak için sonuca ihtiyacınız vardır. Bu argüman listesinin boyutu, OS'ye özgü bir boyut sınırına tabidir. Bir iç komut için, kabuk bütün olarak kontrol altındadır, bu yüzden sadece bir dosyayı gövdeyi işlemek için sonuçtan tek seferde alması gerekir. – chepner