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