在BASH中重命名多个文件

4

我想对文件进行重新编号:我有一些以“???”格式命名的文件,我需要将它们改为“????”格式。

myfile_100_asd_4 to myfile_0100_asd_4

感谢您,Arman。
不太优雅的解决方案:
#/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文件。
4个回答

8

使用perl自带的一个小脚本rename

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

如果在表达式之前使用-n参数,它只会打印重命名操作的预览而不实际执行。这样你可以在重命名文件之前验证操作是否正确:
rename -n 's/(\d{3})/0$1/g' myfile_*

1
哎呀,真遗憾我不能将这个标记为另一个解决方案 :) - Arman

5

只需使用命令行:

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

1

尝试:

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

使用shell扩展而不是ls。Shell具有字符串操作功能,因此外部命令实际上是不需要的。 - ghostdog74
ghostdog74:你能否详细解释一下? - Arman
哇,我从来没有用过“剪切”,它太有用了 :) - Arman
@modi,我不是那个点踩你的人。请不要失态。即使我想点踩,这也是我的选择。你能怎么样呢? - ghostdog74
@arman,“cut”是一个外部命令。每次为找到的文件调用“cut”3次都很“昂贵”。 - ghostdog74
@ghostdog74,如果你不是那个点踩的人,我很抱歉。有位男士花时间尝试帮助,发表评论以完善他的答案,选择点踩还是不点踩是你的自由,如果你是那个点踩的人,而我称呼你为笨蛋是我的选择。 - jojo

1

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

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


在我的发行版(Mandriva)上,我只有:mren(1) 名称 mren-重命名现有的MSDOS文件没有ren。 - Arman
我注意到有些发行版似乎没有附带它,因此我提供了一个链接到Freshmeat页面和源代码下载链接。 - slyfox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接