Как удалить файл, имя которого начинается с â € œ-â € (дефис 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"
Как предотвратить интерпретацию символа минус (тире или дефиса) как параметра?
10 ответов
Используйте «-», чтобы заставить rm останавливать параметры командной строки, например:
rm -- --help
Или вы можете сделать
rm ./--help
Используйте find
, чтобы сделать это:
find . -name '--help' -delete
И это хороший метод, потому что, если у вас есть более чем несколько таких файлов, которые вы можете удалить, вы можете получить список превью файлов, просто выполнив поиск без опции -delete
, а затем, если список файлов выглядит хорошо, просто запустите его снова с помощью -delete
.
На самом деле вы избегаете rm
в пользу find
(особенно с предварительным просмотром) - хорошая привычка, которая поможет вам избежать ошибок с помощью rm *
, который неизбежно укусит вас когда-нибудь.
Обратите внимание, что поиск будет проходить через все ваши подкаталоги, поэтому вы можете запустить его с помощью ограничения глубины подкаталога, например:
find . -maxdepth 1 -name '--help' -delete
, который ограничивает поиск в текущем каталоге.
Ответы 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. Это позволяет вам просмотреть список возможных завершений ( для получения дополнительной информации ).
Брутальное решение:
perl -e "unlink '--help' or die 'Could not unlink.';"
perl -e "rmdir '-d' or die 'Could not rmdir.';"
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, он ушел.
Midnight Commander (mc
) - самый простой, просто на нем и нажмите F8;)
вот решение, которое я использовал, прежде чем найти этот поток.
используйте vim
в каталог «edit»:
vim .
затем (в vim) выберите ваш файл, нажмите del и подтвердите удаление.
когда вы закончите, выйдите из vim с помощью :q
Вы пытались добавить имя каталога в качестве префикса:
$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste
Использование каталога как префикса файла в общем помогает избежать неправильной интерпретации символа «минус» в качестве параметра команды с помощью функции парсера.
Если вы хотите переименовать файл, -.bar
, (mv не будет работать), попробуйте следующее:
cat >foo.bar <-.bar
перед использованием команды:
rm -- -.bar
Вы должны проверить исходное содержимое файла в foo.bar