2010-03-10 73 views
4

我想重命名文件编号:我有一个文件'???'我需要把它们放在'????'中。重命名BASH中的几个文件

myfile_100_asd_4 to myfile_0100_asd_4 

谢谢 阿尔曼。

并非如此优雅的解决方案:

#/bin/bash 
snap=`ls -t *_???` 
c=26 
for k in $snap 
do 

    end=${k} 
    echo mv $k ${k%_*}_0${k##*_}_asd_4 
    ((c=c-1)) 

done 

这对我的作品,因为我有myfile_100的文件。

回答

5

只是用外壳,

for file in myfile* 
do 
    t=${file#*_} 
    f=${file%%_*} 
    number=$(printf "%04d" ${t%%_*}) 
    newfile="${f}_${number}_${t#*_}" 
    echo mv "$file" "$newfile" 
done 
1

有一个名为的ren应用程序renmanpage),它支持使用搜索和替换模式重命名多个文件。你应该能够凑齐一个模式,将额外的0注入文件名。

编辑:项目页面w /下载链接可在Freshmeat找到。

+0

在我的分布(Mandriva的)我只有你重命名文件之前,这样,您就可以验证它工作正常: mren(1) 名称 mren - 重命名现有的MSDOS文件 没有人。 – Arman 2010-03-10 11:15:41

+0

我注意到有些发行版似乎并没有提供它,因此为什么我提供了链接到Freshmeat页面并链接到源代码下载。 – slyfox 2010-03-10 11:44:25

8

使用rename,附带perl的一个小脚本:

rename 's/(\d{3})/0$1/g' myfile_* 

如果你传递只打印什么文件重命名为会做之前的表达式-n参数,不采取任何行动。

rename -n 's/(\d{3})/0$1/g' myfile_* 
+1

嗯,很遗憾我不能将这个标记为另一个解决方案:) – Arman 2010-03-10 12:00:15

0

搜索:

for file in `ls my*` 
do 
a=`echo $file | cut -d_ -f1` 
b=`echo $file | cut -d_ -f2` 
c=`echo $file | cut -d_ -f3,4` 

new=${a}_0${b}_${c} 
mv $file $new 
done 
+0

使用shell扩展而不是'ls'。并且shell具有字符串操作功能,所以外部命令实际上不需要。 – ghostdog74 2010-03-10 11:16:09

+0

ghostdog74:你能解释一下吗? – Arman 2010-03-10 11:26:02

+0

哇,我从来没有用过“剪”,它是如此有用:) – Arman 2010-03-10 11:37:18