7

Я создал файл с именем \;:$"\' для тестирования моего программного обеспечения. Я закончил с ошибкой, потому что я не могу удалить свойство файла. Я пытаюсь найти точную комбинацию символов, чтобы удалить ее через rm , но не могу найти способ.

rm \\;:$\"\\\'
rm: cannot remove `\\': No such file or directory

rm "\\"\;:$\"\\\'
rm: cannot remove `\\;:$"\\\'': No such file or directory

rm '\;:$"\'''
rm: cannot remove `\\;:$"\\': No such file or directory

(Эта последняя попытка убила меня)

И много-много других попыток. Нужна помощь руки!

8 ответов8

12

Если имя файла точно \;:$"\' , то вы сможете удалить его с помощью:

rm \\\;\:\$\"\\\'

Просто убери всех персонажей одним \ .

5

Вы можете попробовать ls -li в каталоге, содержащем файл, и удалить файл с возвращенным индексом, введя find . -inum <inode-number> -exec rm -i {} \;

Я добавил -i в команду find, чтобы запросить удаление перед тем, как команда find найдет другой файл, чем вы ожидаете.

В дополнение к комментарию я попытался создать и удалить файл самостоятельно:

ls -l
total 0
-rw-r--r-- 1 test test 0 mrt 24 14:11 \;:$"\'

[test@testhost +1] /tmp/ff$ rm \\\;\:\$\"\\\' 

[test@testhost +1] /tmp/ff$ ls -l
total 0
2

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

rm '\;:$"\'\'

В интерактивном режиме вы можете просто использовать завершение табуляции, начиная с '\ или \\ . Завершение табуляции из '\ yields '\;:$"\'\''' , поскольку bash просто заменяет каждую встроенную одинарную кавычку на '\'' . Завершение табуляции с нуля или из \\ yields \\\;\:\$\"\\\' .

2

В Баш и аналогичных снарядов

read -r; rm "$REPLY"

затем просто введите имя файла буквально, \;:$"\' , и нажмите Enter. Команда read читает строку из стандартного ввода и сохраняет ее в переменной REPLY . Флаг -r говорит ему буквально читать строку и не интерпретировать обратные слэши как escape-последовательности. Цитирование $REPLY гарантирует, что содержимое REPLY будет передано в rm как один аргумент, поэтому это также будет работать, даже если имя файла содержит пробелы или символы табуляции.

(Примечание. Если имя файла содержит символы новой строки, очевидно, что вы можете использовать опцию -d для read чтобы изменить завершающий символ для строки, которую вы хотите ввести.)

1

Если вы не ограничены использованием bash или другой среды сценариев оболочки, простым способом удалить такой файл, вероятно, будет либо написать короткую программу, которая просто вызывает unlink() на вашем любимом языке, либо использовать файловый менеджер, такой как Gnome. Commander или Midnight Commander для удаления файла вручную. Последний вариант позволит вам выбрать рассматриваемый файл и удалить его, даже не вводя имя файла в любом месте, что исключит возможность того, что метасимволы вообще будут иметь какое-либо особое значение.

0

Попробуй это,

$ rm \\\;\:\$\"\\\'

«\» используется в качестве escape-последовательности в скриптах bash, что имеет буквальное значение.

0

Я считаю, что в таких случаях проще всего набрать / экранировать не более нескольких символов, а затем позволить bash завершить команду с помощью <TAB>: bash затем обязательно процитирует материал, подходящий для его собственных целей.

В этом случае, если я делаю

touch '\;:$"\'\'
rm \ <TAB>

завершение повторного <TAB> впоследствии переходит к

rm \\
rm \\\\
rm \\\\\\\\
rm \\\;\:\$\"\\\' 

Сейчас я немного растерялся, объясняя промежуточные этапы, но последнее предложение разумно.

Как правило, когда не используется завершение, я склоняюсь к цитированию всего, включив его в знаки '...' . Очевидно, что вам нужно написать ' себя как '\'' , а именно завершить кавычки, напишите \; создать один ' и ввести еще одну строку в кавычках. Это рецепт, который я использовал для команды touch, за исключением пропуска окончательного результата '' поскольку он ничего не добавляет.

0

Другим хорошим решением является установка oh-my-zsh,
введите rm и перейдите к файлу, который вы хотите удалить. ;)

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