Как удалить файл, имя которого начинается с â € œ-â € (дефис 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"

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

288 голосов | спросил Bryan Rehbein 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 23:30:42 +0400 2010, 23:30:42

10 ответов


395

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

rm -- --help
ответил Vegar Nilsen 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 23:34:14 +0400 2010, 23:34:14
178

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

rm ./--help
ответил edfuh 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 03 Sep 2010 03:56:26 +0400 2010, 03:56:26
33

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

find . -name '--help' -delete

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

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

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

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

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

ответил aculich 6 TueEurope/Moscow2011-12-06T05:44:08+04:00Europe/Moscow12bEurope/MoscowTue, 06 Dec 2011 05:44:08 +0400 2011, 05:44:08
19

Ответы Vegar Nilsen и edfuh очень хорошие и правильные решения такой проблемы.

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

rm

Так как номера inode уникальны в каждой файловой системе, вы можете удалить любой файл, используя это; unicode или использование escape-символов. Как всегда очень раздражать, чтобы напечатать, поэтому я бы рекомендовал добавить строку

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

в файл TAB: menu-complete # Tab: Cycles through the command "\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards , если вы используете bash. Это позволяет вам просмотреть список возможных завершений ( для получения дополнительной информации ).

ответил Baldur 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 20 Sep 2010 23:55:49 +0400 2010, 23:55:49
9

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

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

perl -e "rmdir '-d' or die 'Could not rmdir.';"
ответил Thomas L Holaday 8 PM000000110000005131 2012, 23:34:51
8

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  

Aaaannd, он ушел.

ответил Eric Leschinski 28 J000000Monday14 2014, 19:06:53
2

Midnight Commander (mc) - самый простой, просто на нем и нажмите F8;)

ответил Marcin 14 Jpm1000000pmSat, 14 Jan 2012 19:53:08 +040012 2012, 19:53:08
1

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

vim .

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

ответил atti 12 PMpWed, 12 Apr 2017 23:17:36 +030017Wednesday 2017, 23:17:36
0

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

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

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

ответил Paulo Henrique Lellis Gonalves 4 PMpWed, 04 Apr 2018 14:29:42 +030029Wednesday 2018, 14:29:42
-2

Если вы хотите переименовать файл, -.bar, (mv не будет работать), попробуйте следующее:

cat >foo.bar <-.bar

перед использованием команды:

rm -- -.bar

Вы должны проверить исходное содержимое файла в foo.bar

ответил Stephen Menasian 26 MonEurope/Moscow2011-12-26T01:38:00+04:00Europe/Moscow12bEurope/MoscowMon, 26 Dec 2011 01:38:00 +0400 2011, 01:38:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132