У меня есть файл с именем ~ (тильда) в моем домашнем каталоге

46

Я только что заметил, что у меня есть файл с именем ~в моем ~-directory.

$ ls -la ~
...
-rw-r-----  1 x1 x1  733962240 Mar  1 17:55 ~
...

Любая идея, как я могу mvили rmэто?

scrrr
источник
Попробуйте удалить его по i-узлу.
Гроностай

Ответы:

55

Практически идеальное решение для файлов, которые нельзя удалить обычными средствами:

ls -il 

В первом столбце будет показан номер индекса файлов.

find . -inum [inode-number] -exec rm -i {} \;

Это удалит файл с указанным номером inode после проверки.

Squeezy
источник
Это сработало. Возможно, решение от rici тоже хорошо, но я не пробовал. Большое спасибо!
scrrr
Да, ответ Ричи тоже хорош. И я думаю, что это лучше, потому что это проще.
Андрей Регентов
приятно +1. Я изменил ваш ответ, чтобы использовать -deleteвместо -exec, а затем понял, что вы используете, rm -iчто является хорошей идеей, поэтому я откатился назад. Сожалею.
тердон
Не беспокойся Всегда рад, когда кто-то посчитает мои ответы достойными своего времени :)
Squeezy
Этот ответ не работал для меня. Ubuntu 14.04 LTS
KhoPhi
46

Вы должны иметь возможность ссылаться на этот файл как ~/~(без кавычек), потому что расширение тильды применяет тильду ( ~) только в самом начале слова.

RICi
источник
17
Кроме того, перейдя в папку и rm ./~, по той же причине, по которой вы сказали
Карлос Кампдеррос
@ CarlosCampderrós подумайте над тем, чтобы ответить на этот вопрос. Я бы посчитал это «лучшим» и наиболее простым решением по сравнению с другими ответами, поскольку ./~буквально означает «файл или папку с именем ~в текущем каталоге» . Нет таких хаков, как escape-символы или ссылки на inode.
ADTC
@ADTC: в защиту моего ответа, это не требует изменения CWD, тогда как использование ./~делает. Спустя пять лет моя память немного размыта, но я думаю, что именно поэтому я предложил, ~/~а не более нормальный ./~: вопрос конкретно относится к «файлу, названному ~в домашнем каталоге [OP's] »; не "в текущем каталоге".
Ричи
@rici Это имеет смысл, и в контексте вопроса это будет уместно. Но мне нравится видеть ответы общего характера или сначала говорить в общем, прежде чем подробно остановиться на конкретном случае вопроса. Это моя защита: D
ADTC
20

Цитируйте это ( rm '~') или избегайте этого ( rm \~).


Это всегда либо один из них (также, например, $), либо add, --чтобы имя файла не интерпретировалось как аргумент: rm -- -iудаляет файл с именем -i; также полезно, rm -- *когда вы хотите удалить все файлы в текущем каталоге: не случайно, rm -f *только потому, что файл назван так.

Даниэль Бек
источник
Хм, нет, это, похоже, не работает .. Я пробовал одинарные кавычки, экранирование и обратные кавычки ... он не берет файл. Говорит, что он не существует или интерпретирует ~ как домашний каталог ..
scrrr
@scrrr Какая у тебя оболочка?
Даниэль Бек
Баш. Но проблема решена inode способом.
scrrr
@scrrr Рад, что ваша проблема решена, но теперь я хочу знать, почему экранирование bash не работает в вашей системе так же, как в моей.
Исаак Рабинович
1
Осторожный. --только останавливает следующие аргументы, интерпретируемые как параметры - это не мешает оболочке выполнять расширение (например *), что и происходит здесь. (Я знаю, что вы предложили это в качестве альтернативы для других ситуаций, но было бы неплохо предупредить.)
Боб