Как удалить папку, имя которой начинается с символа «$»? [дубликат]

Команды разработчиков и администраторов компании, о которой вы говорите, связаны к perl, что восходит к зарождению исходной системной архитектуры, которую они использовали. Это привело к развитию корпоративной культуры, в которой предпочтение отдается Perl. Обратите внимание, что каждый раз, когда этот вопрос задают на форуме, вопрос начинается со слов «Я работаю в хостинговой компании, и все здесь говорят…» Просто погуглите «find vs. find2perl» и просмотрите результаты. Вы будете видеть одно и то же предисловие каждый раз, когда вас спросят. Вы не найдете никаких реальных доказательств того, что слухи верны, потому что их нет. Все слышали это от кого-то другого, кто слышал это от кого-то другого, кто слышал это от кого-то, кто просто отдает предпочтение Perl.

11
03.11.2016, 00:03
5 ответов

$ , пробел, ' и [ - специальные символы в большинстве оболочек. Чтобы удалить их особое значение, вы должны использовать механизмы цитирования оболочки.

Синтаксис кавычек очень сильно зависит от оболочки .

Во всех известных мне оболочках вы можете использовать одинарные кавычки, чтобы заключить в кавычки все символы, кроме одинарных кавычек, обратной косой черты и новой строки (в оболочках, подобных Bourne, они также заключают в кавычки последние два, за исключением обратных кавычек для \ в некоторых).

rm -r '$pattern'

Должно работать в наиболее распространенных оболочках.

rm -r \$pattern

Работает (кроме внутренних обратных кавычек для команд Борна) во всех оболочках, кроме семейства rc .

То же самое для:

rm "\$option[value='2016']"

В rc -подобных оболочках вы должны использовать:

rm '$option[value=''2016'']'
20
27.01.2020, 19:56

Если ничего не помогает, вы можете удалить файл на основе номера inode. Сначала перечислите все файлы в текущем каталоге с номерами inode

ls-il

, затем, используя первый номер распечатки для соответствующего имени файла, вы можете использовать следующую команду для удаления на основе номера inode

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

Пример

$ ls -il
total 0
804743 -rw-r--r--  1 staff  0 Nov  2 19:49 test1
804744 -rw-r--r--  1 staff  0 Nov  2 19:49 test2

$ find . -inum 804743 -exec rm -i {} \;
remove ./test1? y

$ ls -il
total 0
804744 -rw-r--r--  1  staff  0 Nov  2 19:49 test2
0
27.01.2020, 19:56

Вы просто экранируете символ, используя "\", это также обычная практика, используемая при написании запросов SQL в веб-приложениях, чтобы предотвратить выполнение других команд базы данных чем предполагалось.

0
27.01.2020, 19:56

Если каталог пуст:

rmdir \$pattern

В противном случае:

rm -r \$pattern

(Будет рекурсивно удален любой файл, содержащийся в папке)

{{1} }
16
27.01.2020, 19:56

Когда вам нужно работать с файлом, который содержит специальные символы, можно использовать функцию автозаполнения bash: начните вводить свою команду (в данном случае rmdir ) а затем несколько раз нажмите Tab . Это будет циклически перемещаться по всем файлам / каталогам в текущем каталоге, автоматически экранируя все специальные символы.

Это также хорошо работает, если вы работаете с очень длинными именами файлов.

3
27.01.2020, 19:56

Теги

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