Удаление файла, имена которого начинаются с -
это часто задаваемые вопросы, но похоже, что у вас другая проблема.
Из решений, которые вы упомянули в вопросе:
rm -- -
Это должно работать.
rm "-"
Это ничем не отличается от rm -
. Кавычки отбрасываются оболочкой, а команда rm
видит только один дефис в качестве аргумента. Кавычки полезны для экранирования метасимволов оболочки; дефис является особенным для rm
, а не для оболочки.
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 ?
следует удалить его (вместе с любыми другими такими файлами).