Regex 使用perl one liner重命名匹配文件时出错
我想重命名所有与模式匹配的文件。 这种单行程序通常对我有效,但我遇到了一些错误 我拥有的文件名类型:PMSNpoda5718_1p2g_out_fst.txt SCSNpoda5718_1p2g_out_fst.txt 我想要的文件名:PM-SN_poda5718_1p2g_out_fst.txt SC-SN_poda5718_1p2g_out_fst.txt 我的第一次尝试是:Regex 使用perl one liner重命名匹配文件时出错,regex,perl,unix,file-rename,Regex,Perl,Unix,File Rename,我想重命名所有与模式匹配的文件。 这种单行程序通常对我有效,但我遇到了一些错误 我拥有的文件名类型:PMSNpoda5718_1p2g_out_fst.txt SCSNpoda5718_1p2g_out_fst.txt 我想要的文件名:PM-SN_poda5718_1p2g_out_fst.txt SC-SN_poda5718_1p2g_out_fst.txt 我的第一次尝试是: ls *fst.txt | perl -ne '/^([A-Z][A-Z])([A-Z][A-Z])(poda.*?
ls *fst.txt | perl -ne '/^([A-Z][A-Z])([A-Z][A-Z])(poda.*?$)/; system("mv $_ $1-$2_$3")'
但它不起作用
最后我想出了一条打印出我想要的东西的线
ls *fst.txt | perl -lne '/([a-zA-Z]{2})([a-zA-Z]{2})(poda.*?$)/; print "mv $_ $1-$2_$3"'
印刷品:
mv PMSNpoda5718_1p2g_out_fst.txt PM-SN_poda5718_1p2g_out_fst.txt
mv SCSNpoda5718_1p2g_out_fst.txt SC-SN_poda5718_1p2g_out_fst.txt
但当我使用它来重命名文件时:
ls *fst.txt | perl -lne '/([a-zA-Z]{2})([a-zA-Z]{2})(poda.*?$)/; system("mv $_ $1-$2_$3")'
我明白了
再一次,但增加了回声
ls *fst.txt | perl -lne '/([a-zA-Z]{2})([a-zA-Z]{2})(poda.*?$)/; system("echo mv $_ $1-$2_$3")'
我明白了
有人能告诉我哪一个是错误的,这样我就能明白我做错了什么
谢谢 没有理由通过shell运行重命名
ls -1 *fst.txt | perl -MFile::Copy=move -wlnE'
$new = s/([a-zA-Z]{2})([a-zA-Z]{2})/$1-$2_/r; move $_, $new'
注意ls
上的-1
选项,这样每行就有一个文件名
32m
和[0m
是ANSI转义码,可以为终端设置颜色(和其他属性),通常用于外壳配置(例如提示)。也许你的ls
正在推出这些,而mv
正与它们严重混淆?这又是一个例子,说明了为什么最好避免穿过外壳,当然,除非必要
在某些shell中,通过在命令前面加上反斜杠,\ls
,可以抑制现有的别名,即命令实际上是通过各种选项运行的(这就是为什么ls
输出会被这些代码“修饰”的原因)
另一种选择是尽可能减少对系统的依赖,并在程序中构建文件列表
perl -MFile::Copy=move -wE'
for (glob "*fst.txt") {
$new = s/([a-zA-Z]{2})([a-zA-Z]{2})/$1-$2_/r;
move $_, $new or warn "Cant rename $_ to $new: $!" }'
构建正确文件列表的责任现在在
glob
上,您在ls
的输出中是否有ANSI颜色?如果有,请尝试关闭颜色。是的,文件名为绿色,我是否应该删除别名ls=“ls-p--color”
from.bash_profiles是的,也可以参见,或者只键入unalias ls
,参见@Mosky至少您应该从ls
手册页切换到--color=auto
@Mosky:“使用--color=auto
,ls
仅当标准输出连接到终端时才会发出色码。”因此,当您通过管道连接到另一个程序时,它不会添加这些代码(从那时起,它就不会连接到终端)还有一个LS\u COLORS
环境变量,请参见手册页。另外,请尝试\LS
,因为它应该在没有别名的情况下运行——对于这一次执行。那么为什么要将LS
导入perl
?您只需执行perl-wE'for(glob“*fst.txt”){$new=s/([a-zA-Z]{2})([a-zA-Z]{2})/$1-$2\/r;重命名$\$new或警告“$\>$new:$!\n”}
@melpomene是的,没有必要。但是我不认为在外部构建文件列表有任何问题,虽然它可能会降低复杂性。将添加更多内容,感谢您的评论请查看ls |……
是个坏主意的一些原因(在OP的情况下,它会添加颜色代码)。问题的原因可能是,如果有太多与模式匹配的文件,则生成的列表可能会超过argv
@melpomene的大小限制。我这里的重点是让OP来构建文件列表,而不是解析ls
;我不建议解析ls
。因此,假定它们提交一个好的文件列表,就在它们上面。将其移动到程序中需要程序确保一切正常——这很好,但它会添加到程序中感谢各位,我将尝试减少对解析的依赖。通常我在unix服务器上工作,没有问题,但现在我在使用cygwin的windows计算机上遇到了这个问题。使用glob
的两个代码都工作得很好!
ls -1 *fst.txt | perl -MFile::Copy=move -wlnE'
$new = s/([a-zA-Z]{2})([a-zA-Z]{2})/$1-$2_/r; move $_, $new'
perl -MFile::Copy=move -wE'
for (glob "*fst.txt") {
$new = s/([a-zA-Z]{2})([a-zA-Z]{2})/$1-$2_/r;
move $_, $new or warn "Cant rename $_ to $new: $!" }'