批量重命名以' - '开头的文件?

时间:2013-12-28 03:04:34

标签: perl bash sed awk

我通常会收到一堆名称以短划线' - '开头的文件。当我执行任何类型的linux命令时,这会导致各种各样的问题,因为之后的任何事情都被解释为标志。 在文件前面没有短划线字符的情况下,重命名这些文件的最快方法是什么。我可以通过在文件名前添加“ - ”来手动重命名每个文件。例如:' - File1'将被重命名为

mv -- -File1 File1

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

4 个答案:

答案 0 :(得分:4)

引用此类文件的最简单方法是./-File1。 (无论如何,如果文件在当前目录中,你只会遇到问题。)也许如果你习惯了,那就不那么糟了。

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

for f in -*; do mv "./$f" "renamed$f"; done

或者,正如@shellter在评论中建议的那样,重现OP中的例子:

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

注意:上述内容只会从名称中删除一个-

答案 1 :(得分:2)

如果你有util-linux软件包(大部分都可以吗?):

rename - '' ./-*

man rename

答案 2 :(得分:0)

在shell中可能更容易做到这一点,但是如果你担心特殊情况或者你只是想使用perl,那么有两种方法可以做到这一点。一种是使用File::Copy 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内置,但理论上这对某些系统实现不起作用:

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;
}

答案 3 :(得分:0)

使用find:

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