我有这样的文件名:
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编码的新手,因此任何建议都会有很大的帮助。
谢谢
答案 0 :(得分: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
(这将是完全有效和合法的)
您的代码无法使用它们:
for i in *.tif; do
mv "$i" "$i".bak
mv $i $i.bak
end
会做两件完全不同的事情:第一件实际上会重命名文件,后者会尝试执行
mv MOD13Q1 A2013001 h25v08 005 2013018031021 hdf 250m_16_days_EVI.tif MOD13Q1 A2013001 h25v08 005 2013018031021 hdf 250m_16_days_EVI.tif.bak
表示移动/重命名文件MOD13Q1
,A2013001
,h25v08
,005
,2013018031021
,hdf
,{{1 },250m_16_days_EVI.tif
,MOD13Q1
,A2013001
,h25v08
,005
和2013018031021
到hdf
。
答案 1 :(得分:1)
使用mmv
:
mmv -n "MOD13Q1.*.005.*.hdf.250m_16_days_*.tif" "#1_#3.tif"
如果输出看起来正确,请删除-n
以实际重命名文件。
注意:mmv
不是标准命令,您可能必须使用系统的包管理器安装它。