Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用perl one liner重命名匹配文件时出错_Regex_Perl_Unix_File Rename - Fatal编程技术网

Regex 使用perl one liner重命名匹配文件时出错

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.*?

我想重命名所有与模式匹配的文件。 这种单行程序通常对我有效,但我遇到了一些错误

我拥有的文件名类型: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.*?$)/; 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: $!" }'