如何使用Perl轻松批量重命名文件?
我有很多要重命名的文件,我试图创建一个正则表达式来匹配它们,但即使我被困在这些文件中,它们的名称也如下所示: 文件名01 文件名100 文件名02 文件名03 等等,我想在小于100的任何文件后面添加一个“0”(零),如下所示: 文件名001 文件名100 文件名002 文件名003 我找到的最接近匹配它们的方法是使用这个find-type d | sort-r | grep'[1-9][0-9]$,但是我不知道如何替换它们。提前谢谢你能给我的任何帮助。我在CentOS上,如果这有什么帮助的话,所有这些都是通过SSH完成的。我想这是你的朋友如何使用Perl轻松批量重命名文件?,perl,file,rename,bulk,Perl,File,Rename,Bulk,我有很多要重命名的文件,我试图创建一个正则表达式来匹配它们,但即使我被困在这些文件中,它们的名称也如下所示: 文件名01 文件名100 文件名02 文件名03 等等,我想在小于100的任何文件后面添加一个“0”(零),如下所示: 文件名001 文件名100 文件名002 文件名003 我找到的最接近匹配它们的方法是使用这个find-type d | sort-r | grep'[1-9][0-9]$,但是我不知道如何替换它们。提前谢谢你能给我的任何帮助。我在CentOS上,如果这有什么帮助的话,
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
或者类似的,只要
-print0
和-0
)按以下顺序运行两个命令:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
第一个将所有小于10的项重命名,并在前面加上零。第二个函数重命名小于100的所有对象,并在前面加上零。结果应该是所有文件名的三位数字。您可以使用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
dirlisting=DIR.entries('.'))
dirListing.each do|file|
num=file.match(/\d+$/)。到\u i
如果num<100
找到开始编号的位置,使用索引并将0插入该位置。
结束
结束
这是一次性的吗?如果是这样的话,我将提出一些可能被许多程序员所回避的建议:
通过管道将命令的输出(find-typed | sort-r | grep'[1-9][0-9]$'
)传输到一个文件,并使用编辑器和一些全局搜索/替换魔术创建一个执行重命名的脚本
然后扔掉剧本
通过尝试一个聪明的(但调试不充分的)一行程序进入你文件中的杂草中,你不会大惊小怪,也不太可能最终击中自己的脚
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
可能有点过头了,但它做到了要求的。在我的debian中,它可以很好地使用rename,并用300个文件进行了测试
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);
}
}
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
如果你的遥控器有bashshell
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
删除“echo”以进行实际重命名您的文件名是否包含空格?是的,它们看起来像:“文件名01”“文件名101”您能详细介绍一下机器上可用的“工具”吗?您是否安装了perl、python、ruby或类似的软件?您能否澄清您试图匹配的文件名是什么,以及您试图避免匹配的文件名是什么?我在这里有点困惑。Perl(5.8.8)在机器上,但是python和ruby不是,我很熟悉,可以通过yum进行安装,如果需要的话。您可能应该提到这段代码是ruby,而不是perlAnd,这就是为什么我说您应该消除代码是ruby这一事实的歧义。这接近于我要建议的内容,使用sed而不是xargs,所以我将+1它。我知道xargs是一种方法,但我无法编写确切的命令。+1用于列出依赖项(您所指的重命名实用程序可能是一个yum或apt-way)。我一直对cygwin perl发行版不包含rename感到愤怒。++!有时,使用你理解的乱七八糟的东西比学习“深层魔法”要好。+1我认为这类东西通常是一次性需求的最实用的解决方案。这可能是一种逃避,但它是一种安全的逃避……值得称赞。在vim中可能的全局搜索和替换魔法是
:s/^\(.*)\(\d\d\)$/mv\1\10\2/
在Emacs中,您可以打开目录列表,按C-x C-q,编辑缓冲区中的文件名(例如,使用搜索和替换或任何其他命令),保存后Emacs将重命名文件。rename
是标准perl发行版附带的实用程序。我在Linux Bash下运行了这些。它将文件名100
重命名为文件名0100
,这是无意的。你肯定是对的。添加了一些代码,这样就不会发生这种情况。