2016-03-24 19 views
0

Ben unix yeni duyuyorum ve aşağıdakileri yapmanız gereken dinamik dosya adlarını değiştirin: Ben isimde 10 dosyaları var:unix dinamik dizeleri

t1_20160322_load_8977854_49843489_1.xml 
t1_20160322_load_8977855_47536364_1.xml 
t1_20160322_load_8977856_93435735_1.xml 
t1_20160322_load_8977857_78637575_1.xml 
t1_20160322_load_8977858_97437542_1.xml 
.... 

ve aşağıdaki içeriğe sahip bir dosya (loadnumber.txt) almıştır :

8977854;EUROLOADSAMPLE;c 
8977855;ASIENLOADSAMPLE;i 
8977856;AFRICANLOADSAMPLE;s 
8977857;USALOADSAMPLE;l 
8977858;CANADALOADSAMPLE;o 

ben dosya t1_20160322_load_8977854_49843489_1.xml

şekilde değiştirilmelidir örneğin, metin dosyasından değerle sayısını değiştirmeniz gerekiyor

210 ve dosya t1_20160322_load_8977854_49843489_1.xml t1_ASIENLOADSAMPLE_i.xml

şekilde değiştirilmelidir ben Unix komando yazma google çalıştı, ama ben temel bilgi eksik düşünüyorum, bu yüzden şunları yazmaktadır:

for f in $(t1*xml);do;for x in $(cat contracts_generator.txt);do;g=$(echo $x | cut -d\; -f1); n=$(echo $x | cut -d\; -f2); m=$(echo $x | cut -d\; -f3);mv $f t1_$n.xml;done;done 

Bu elbette işe yaramadı. Kodun nasıl yazılacağını öğrenmek için bana yardımcı olabilir misiniz?

Yanıtlarınız için şimdiden çok teşekkür ederim.

cevap

0

Bir şeyi anlamak isterseniz, sorununuzu çözmek için bir kabuk komut dosyası oluşturmalısınız. İçeriğinizle myscript.sh adlı bir dosya oluşturun.

Sizin çok uzak, bu yüzden öyle sabit değildir burada:

for f in $(ls t1*xml) 
    do 
     #echo $f 
     mymatch=$(echo $f |cut -d"_" -f4) 
     #echo $mymatch 

     for x in $(cat contracts_generator.txt) 
     do 
      g=$(echo $x | cut -d\; -f1) 
      if [[ "$g" == "$mymatch" ]] 
      then 
      n=$(echo $x | cut -d\; -f2) 
      m=$(echo $x | cut -d\; -f3) 
      fi 
     done 
     mv ${f} t1_${n}_${m}.xml 
    done 

(debug echo önce # kaldırmak) Ardından bu yüzden komut çağırır:

sh myscript.sh