我通常会收到一堆名称以短划线' - '开头的文件。当我执行任何类型的linux命令时,这会导致各种各样的问题,因为之后的任何事情都被解释为标志。 在文件前面没有短划线字符的情况下,重命名这些文件的最快方法是什么。我可以通过在文件名前添加“ - ”来手动重命名每个文件。例如:' - File1'将被重命名为
mv -- -File1 File1
但是,当我必须动态重命名100个文件时,这并不理想。目前我必须将其导出并使用Windows程序,以便我可以批量重命名它们,然后将其上传回Linux机器。
答案 0 :(得分:4)
引用此类文件的最简单方法是./-File1
。 (无论如何,如果文件在当前目录中,你只会遇到问题。)也许如果你习惯了,那就不那么糟了。
要批量重命名,您可以执行以下操作:
for f in -*; do mv "./$f" "renamed$f"; done
或者,正如@shellter在评论中建议的那样,重现OP中的例子:
for f in -*; do mv "./$f" "${f#-}"; done
注意:上述内容只会从名称中删除一个-
。
答案 1 :(得分:2)
答案 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 -- - '' {} \;