it-swarm-ru.tech

Как удалить файл, имя которого начинается с «-» (дефис a.k.a. тире или минус)?

Как удалить файл, имя которого начинается с тире (дефис или минус) -? Я ssh'd на удаленном сервере OSX, и у меня есть этот файл в моем каталоге:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Как в мире я могу удалить --help из CLI? Эта проблема иногда встречается в разных формах, эти файлы легко создавать, но от них сложно избавиться.

Я пробовал использовать обратную косую черту

rm \-\-help

Я пробовал цитаты

rm "--help"

Как предотвратить использование символа минус (тире или дефис) в качестве опции?

377
Bryan Rehbein

Используйте "-", чтобы rm прекратил анализ параметров командной строки, например:

rm -- --help
559
Vegar Nilsen

Или вы можете сделать

rm ./--help
236
edfuh

Используйте find, чтобы сделать это:

find . -name '--help' -delete

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

Фактически, вы избегаете rm в пользу find (особенно с предварительным просмотром) - это хорошая привычка, которая поможет вам избежать ошибок с rm * это неизбежно укусит вас однажды.

Однако обратите внимание, что поиск будет проходить через все ваши подкаталоги, поэтому вы можете запустить его с ограничением глубины подкаталога, например так:

find . -maxdepth 1 -name '--help' -delete

который ограничивает поиск текущим каталогом.

41
aculich

Ответы Вегара Нильсена и Эдфуха очень хорошие и правильные решения такой проблемы.

Я хочу добавить общий ответ на этот вопрос, который позволит вам удалить любой файл со сложным именем файла. Сначала его номер инода получается с помощью ls -i или некоторая форма stat, а затем файл удаляется путем поиска файлов в текущем каталоге по номеру инода и выполнения команды rm для файла с соответствующим номером инода

find . -inode <inode> -exec rm {}\;

Поскольку номера инодов уникальны в каждой файловой системе, вы можете удалить любой файл, используя это; Unicode или использование escape-символов. Это очень раздражает, поэтому я рекомендую добавить строку

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

в ваш .inputrc файл, если вы используете bash. Это позволяет циклически просматривать список возможных завершений ( для получения дополнительной информации ).

21
Baldur

Брутальное решение:

Perl -e "unlink '--help' or die 'Could not unlink.';"

Perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
Thomas L Holaday

Linux Пошаговое руководство по созданию файла с тире и пробелами, а затем его удалению.

БЫТЬ ОСТОРОЖЕН! Не случайно запустить rm -rf / или аналогичная команда каскадного удаления.

Если ваш файл, который вы пытаетесь удалить, включает в себя звездочки или косые черты, случайно не накачайте . или /* или * или другой подстановочный знак, который может каскадно удалить вашу операционную систему.

Создайте файл с именем "--yo yo"

[email protected] ~ $ touch -- "--yo yo"
[email protected] ~ $ ls
bin  --yo yo

Во-первых, найдите его с помощью find:

[email protected] ~ $ find . -name "*--yo yo*"
./--yo yo

Убедитесь, что команда find ТОЛЬКО находит ОДИН файл, который вы хотите удалить:

Затем передайте опцию -delete, чтобы найти, чтобы удалить их:

[email protected] ~ $ find . -name "*--yo yo*" -delete
[email protected] ~ $ ls
bin  

Ааа, и это ушло.

8
Eric Leschinski

Midnight Commander (mc) самый простой, просто наведите на него курсор и нажмите F8;)

2
Marcin

вот решение, которое я использовал, прежде чем найти эту тему.
используйте vim для редактирования каталога:

vim .

затем (в vim) выберите ваш файл, нажмите Del и подтвердите удаление.
когда вы закончите, выйдите из vim с :q

1
atti

Вы пытались добавить имя каталога в качестве префикса:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

Использование каталога в качестве префикса файла в целом помогает избежать ошибочной интерпретации символа "минус" как параметра команды функцией синтаксического анализа.

0