2014-04-02 66 views
0

我有文件名是這樣的:現有的文件名中刪除許多文件名中不需要的部分

MOD13Q1.A2013001.h25v08.005.2013018031021.hdf.250m_16_days_EVI.tif 
MOD13Q1.A2013001.h25v08.005.2013018031021.hdf.250m_16_days_NDVI.tif 
MOD13Q1.A2013001.h25v08.005.2013018031021.hdf.250m_16_days_VI_Quality.tif 
MOD13Q1.A2013017.h25v08.005.2013039200748.hdf.250m_16_days_EVI.tif 
MOD13Q1.A2013017.h25v08.005.2013039200748.hdf.250m_16_days_NDVI.tif 
MOD13Q1.A2013017.h25v08.005.2013039200748.hdf.250m_16_days_VI_Quality.tif 

我也只需要具體細節。我要重命名的文件的名字,如:A2013001_h25v08_EVI.tif

我已經使用的代碼

for f in *.tif 
do  
c1= cut -c9-16 $f  
c2= cut -c18-23 $f  
c3= cut -c60-80 $f  
c= echo $c1$c2$c3 
echo mv "{$f}" "{$c}" 
done 

但這代碼不起作用。還有另一種更好的方法來做到這一點?我對Linux編碼仍然很陌生,因此任何建議都會有很大的幫助。

感謝

回答

1

如果您已經安裝mmv,只是做

mmv MOD13Q1.\*.*.005.2013039200748.hdf.250m_16_days_.*.tif \#1#2#3.tif 

關於你的代碼:

for f in *.tif 
do  
c1= cut -c9-16 $f  
c2= cut -c18-23 $f  
c3= cut -c60-80 $f 

這裏,反引號缺失:

c1=`echo "$f" | cut -c9-16` 
c2=`echo "$f" | cut -c18-23`  
c3=`echo "$f" | cut -c60-80` 

或者,你可以使用

c1=$(echo "$f" | cut -c9-16) 
c2=$(echo "$f" | cut -c18-23)  
c3=$(echo "$f" | cut -c60-80) 

c= echo $c1$c2$c3 

這裏,

c=$c1$c2$c3 

就足夠了。

其他一些說明:除非明確不需要,否則您應該習慣於在變量周圍使用"

如果你有文件,就像

MOD13Q1 A2013001 h25v08 005 2013018031021 hdf 250m_16_days_EVI.tif 

(這將是非常有效和legitime)

你的代碼將無法與他們一起工作:

for i in *.tif; do 
    mv "$i" "$i".bak 
    mv $i $i.bak 
end 

會做兩個完全不同事情:第一個實際上將文件重命名,whicle後者將嘗試執行

mv MOD13Q1 A2013001 h25v08 005 2013018031021 hdf 250m_16_days_EVI.tif MOD13Q1 A2013001 h25v08 005 2013018031021 hdf 250m_16_days_EVI.tif.bak 

這意味着移動/重命名文件MOD13Q1A2013001h25v080052013018031021hdf250m_16_days_EVI.tifMOD13Q1A2013001h25v080052013018031021hdf250m_16_days_EVI.tif.bak

1

使用mmv

mmv -n "MOD13Q1.*.005.*.hdf.250m_16_days_*.tif" "#1_#3.tif" 

如果輸出看起來正確,取出-n實際重命名文件。

注意:mmv不是標準命令,您可能需要使用系統的軟件包管理器來安裝它。