33

я пробовал

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

Любая помощь будет высоко ценится, мудрые люди.

12 ответов12

60

Раньше это публиковалось в часто задаваемых вопросах Usenet для Unix - я вижу, что это в часто задаваемых вопросах по GNU Core Utility. Было как минимум пять разных методов, но это хорошо работает:

$ rm ./-

Если имя файла содержит нетипизированные символы, используйте:

$ rm -i *

Флаг -i запрашивает подтверждение для каждого файла, должен ли он быть удален или нет.

39

Удаление файла, имена которого начинаются с - это часто задаваемые вопросы, но похоже, что у вас другая проблема.

Из решений, которые вы упомянули в вопросе:

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 ? следует удалить его (вместе с любыми другими такими файлами).

18

Если вы хотите что-то более безопасное ...

Попробуйте использовать комбинацию ls и find (это работает для любого файла, который вы можете удалить)

Параметр '-i' даст вам номер инода для каждой записи каталога ls -li

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

Как только у вас есть номер инода ...

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

Дайте rm ./- - попробовать.

- это флаг для запуска аргумента флага. Если вы начинаете аргумент с чего-либо, кроме - , в данном случае / , он будет считать, что это имя файла. Что то, что вы хотите.

А так как file и ./file - это один и тот же файл, он будет нацелен на файл с именем - via ./- .

7

Пытаться:

$ ls -b

чтобы увидеть, есть ли в имени файла непечатаемые символы.

7

Не такой отвратительный, как большинство других ответов, но я бы запустил экземпляр mc , midnight commander и просто выбрал и удалил файл.

6

Не то чтобы здесь нужно было использовать perl, но это должно работать:

perl -e 'unlink "-"'

или посмотреть, что может быть любой ошибкой с вышеперечисленным:

perl -e 'unlink "-" or die "Err: $!"'
3

Мне повезло, используя GNOME Nautilus для удаления плохо названных файлов. Вы используете X-сервер? Я уверен, что другие файловые браузеры тоже будут работать.

3

Если

rm -- -

не работает, имя файла не просто дефис. Если в других файлах нет дефиса, попробуйте

perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- *
1

До сих пор я получаю "Нет такого файла или каталога" для каждого метода, опубликованного до сих пор:

rm ./-
rm -- -
mv "-" test.txt
rm -rf '-' <-- this gives no error, but doesn't work
perl -e 'unlink "-";'  <--also no error, doesn't work.

Похоже, у меня есть версия 7.4. Я попытаюсь обновить и повторить эти предложения. Спасибо всем за помощь.

1

Я очень люблю использовать dired Mode в Emacs для такого рода вещей - просто "открыть" каталог в Emacs. Вы можете легко выбрать файлы и пометить их для удаления.

Другой плакат предложил использовать полуночного командира; это почти та же идея, но если вы уже являетесь пользователем emacs, возможно, это более удобно.

0

Должен быть в состоянии сделать rm -f '-' работал для меня в Cygwin

В этом отношении, rm - также, кажется, работает над красной шляпой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .