我有很多文件我正在尝试重命名,我试图制作一个正则表达式来匹配它们,但即使我被卡在文件上也被命名为:
档案名称01
档案名称100
文件名02
文件名03
等,我想在任何小于100的文件后面添加一个“0”(零),如下所示:
档案名称001
档案名称100
文件名002
文件名003
我最接近匹配他们的是使用这个find -type d | sort -r | grep'[1-9] [0-9] $'然而我无法弄清楚如何更换它们。提前感谢您提供给我的任何帮助。我在CentOS上如果有任何帮助,所有这些都是通过SSH完成的。
答案 0 :(得分:12)
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
可能有点矫枉过正,但它确实提出了要求。
答案 1 :(得分:9)
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
或类似的东西,提供
-print0
和-0
)答案 2 :(得分:4)
这是一次性的吗?如果是这样的话,我会在这里向许多程序员提出一些可能看起来像警察的建议:
将命令的输出(find -type d | sort -r | grep ' [1-9][0-9]$'
)传递给文件,并使用编辑器和一些全局搜索/替换魔法来创建执行重命名的脚本。
然后扔掉脚本。
通过尝试巧妙(但没有经过充分调试)的单行插入文件中的杂草,你可能会有点大惊小怪,并且很有可能最终用脚射击自己。
答案 3 :(得分:2)
按以下顺序运行两个命令:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
首先重命名小于10的所有内容并预先设置为零。第二个重命名小于100的所有内容,并预先设置为零。所有文件名的结果应为三位数。
答案 4 :(得分:1)
在我的debian中,它适用于重命名,使用300个文件进行测试。
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
答案 5 :(得分:0)
我认为mmv是你的朋友。
答案 6 :(得分:0)
你可以用perl或ruby做点什么。
将所有这些文件放在同一目录中
dirlisting = DIR.entries('.')
dirListing.each do |file|
num = file.match(/\d+$/).to_i
if num < 100
find the position where start the number, with index and inject the 0 there.
end
end
答案 7 :(得分:0)
use strict;
use File::Copy;
my @files = glob 'File*Name*';
foreach my $filename (@files) {
if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
my $number = $1;
next if ($number > 99);
rename $filename, sprintf("FileName%03d",$number);
}
}
答案 8 :(得分:0)
如果你的遥控器有bash shell
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
删除“echo”以进行实际重命名