我试过了
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
午夜指挥官的实例,然后选择并删除该文件。