如何在 Linux 中删除名称看起来只有一个连字符(如“-”)的文件

如何在 Linux 中删除名称看起来只有一个连字符(如“-”)的文件

我试过了

rm -- -
rm "-"
rm "\-"
rm \-

尝试一下 Perl

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;'
-
rm: cannot remove `-': No such file or directory

...和...

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;'
-
mv: cannot stat `-': No such file or directory

任何帮助都将不胜感激,明智的人们。

答案1

这曾经发布在 Unix 的 Usenet 常见问题解答中——我看到它在GNU 核心实用程序常见问题解答。至少有五种不同的方法,但这种方法很有效:

$ rm ./-

如果文件名包含无法输入的字符,则使用:

$ rm -i *

-i标志要求确认每个文件是否应被删除。

答案2

删除名称以 开头的文件-是一个常见问题解答,但看起来您遇到了不同的问题。

您在问题中提到的解决方案:

rm -- -

那应该可行。

rm "-"

这与 没什么不同rm -。引号会被 shell 删除,rm命令只会将单个连字符视为参数。引号可用于转义 shell 元字符;连字符是 特有的rm,而不是 shell 特有的。

rm "\-"

引号转义了反斜杠,因此这会尝试删除名称由两个字符(反斜杠和连字符)组成的文件。

rm \-

这就如同rm "-",相当于rm -

事实上,至少在 GNU coreutils 版本中rm,它rm -实际上删除了(或试图删除)一个名称仅由连字符组成的文件。如果你的文件有这个名字,那么现在它已经消失了。我得出的结论是,你的文件有一个名称,只有好像连字符。

ls | cat -A

应该能让人知道它的真实名称。

这是我刚刚编写的 Perl 脚本,它会提示您当前目录中的每个文件并询问是否要删除它。不提供任何保证,但我对其进行了简短的测试。

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;

foreach my $file (@files) {
    print "Remove $file? ";
    my $answer = scalar <>;
    if ($answer =~ /^[Yy]/) {
        unlink $file or warn "$file: $!\n";
    }
    elsif ($answer =~ /^[Qq]/) {
        exit 0;
    }
}

编辑:一个不太复杂的解决方案:如果文件的名称只有一个字符,那么rm ?应该删除它(以及任何其他此类文件)。

答案3

如果您想要更安全的东西...

尝试使用 ls 和 find 的组合(这适用于您有权删除的任何文件)

'-i' 参数将为您提供每个目录条目的 inode 编号 ls -li

27 ----------  1 owner  group       3981 Oct 11 04:42 ?????

一旦您有了 inode 号码...

find . -inum **27** -exec rm -i {} \;

答案4

并不像大多数其他答案那样令人讨厌,但我会启动mc午夜指挥官的实例,然后选择并删除该文件。

相关内容