Perl 批量重命名以'-';?

Perl 批量重命名以'-';?,perl,bash,sed,awk,Perl,Bash,Sed,Awk,我通常会得到一堆文件,它们的名称以破折号“-”开头。当我执行任何类型的linux命令时,这都会导致各种各样的问题,因为后面的任何命令都会被解释为一个标志。 重命名这些文件的最快方法是在文件前面不使用破折号字符。我可以通过在文件名前面添加“---”来手动重命名每个文件。例如:“-File1”将重命名为 mv -- -File1 File1 但当我必须动态重命名100个文件时,这并不理想。目前,我必须将其导出并使用windows程序,以便批量重命名它们,然后将其上载回Linux设备 引用此类文件的

我通常会得到一堆文件,它们的名称以破折号“-”开头。当我执行任何类型的linux命令时,这都会导致各种各样的问题,因为后面的任何命令都会被解释为一个标志。 重命名这些文件的最快方法是在文件前面不使用破折号字符。我可以通过在文件名前面添加“---”来手动重命名每个文件。例如:“-File1”将重命名为

mv -- -File1 File1

但当我必须动态重命名100个文件时,这并不理想。目前,我必须将其导出并使用windows程序,以便批量重命名它们,然后将其上载回Linux设备

引用此类文件的最简单方法是
/-File1
。(不管怎样,只有当文件在当前目录中时,才会出现问题。)如果你习惯了这一点,可能就没那么糟糕了

要批量重命名它们,可以执行以下操作:

for f in -*; do mv "./$f" "renamed$f"; done
或者,正如@shellter在评论中所建议的,在OP中重现该示例:

for f in -*; do mv "./$f" "${f#-}"; done

注意:上面只会从名称中删除一个
-

在shell中可能更容易做到这一点,但是如果您担心特殊情况,或者您更愿意使用perl,那么有几种方法可以做到这一点。一种是使用
文件::复制mv

use strict;
use warnings;
use File::Copy qw(mv);

opendir(my $dir, ".") or die "Can't open $!";
foreach my $file (readdir($dir)) {
    my $new_name = $file =~ s/^-+//r;  #works if filename begins with multiple '-'s
    if ($new_name ne $file) {
        say "$file -> $new_name";
        mv $file, $new_name;
    }
}
或者使用
重命名
内置,但这在理论上不适用于某些系统实现:

rename $file, $new_name;  #instead of mv $file, $new_name;
在任何一种情况下,如果存在具有新名称的文件,它将被此代码悄悄地覆盖。您可能需要一些逻辑来解决这个问题:

# Stick inside the "if" clause above
if (-e $new_name) {
    say "$new_name already exists!"
    next;
}
使用查找:

find -name '-*' -exec rename -- - '' {} \;

如果您有util linux软件包(大多数都有):


给出了O.p.的示例。
mv
的目标可以是
“${f#-}”
。祝大家好运,谢谢。这两种方法都能帮助我解决这个问题。一个问题是“#-”做什么?我在谷歌上到处搜索,找不到它的功能。是某种正则表达式要求变量f的值删除第一个字符吗?
rename - '' ./-*