
Мне нужно удалить все файлы с такими именами (кавычки являются частью имени):
'index.html?some-query-string'
Я пробовал с:
rm \'index.html?*\'
Я получаю эту ошибку:
rm: cannot remove ''\''index.html?*'\''': No such file or directory
решение1
Анализ
кавычки являются частью имени
Ты уверен? Откуда ты знаешь? Есть это«особенность» современного GNUls
, поэтому он печатает имена с дополнительными кавычками, где есть символы ?
внутри; поэтому, когда полный профан скопирует-вставит 'index.html?some-query-string'
и запустит eg rm 'index.html?some-query-string'
, то это будет правильная безопасная команда.
К сожалению, это может сбить с толку более опытных пользователей, которые знают, что им следует заключать в кавычки/экранировать некоторые символы. Ваша rm
команда ( rm \'index.html?*\'
) подходит для имени с кавычками. Она может соответствовать большему количеству имен файлов, поскольку ?*
является шаблоном glob; я предполагаю, что это то, что вам нужно, поскольку вы написали «Мне нужно удалить все файлы». Тот факт, что команда дала вам, No such file or directory
заставляет меня думать, что существующие имена действительно отличаются.
Чтобы подтвердить это, запустите ls -N
. Если эта команда выполняется успешно и выводит имена вродеindex.html?some-query-string
без кавычекзатемэтинастоящие имена.
Решение
Эта часть ответа предполагает, ls
что у вас современный GNU ls
или аналогичный «умный» компьютер, поэтому рассматриваемые кавычки не относятся к имени файла.
Чтобы удалить определенный файл, действуйте как полный профан, который видит 'index.html?some-query-string'
в выводе "smart" ls
, или как пользователь, понимающий необходимость цитирования (я полагаю, что вы такой и есть), который видит index.html?some-query-string
в выводе ls -N
. Выполните:
rm 'index.html?some-query-string'
Или если вы хотите удалить все файлы с именами, начинающимися с index.html?
:
rm 'index.html?'*
Оболочка удалит кавычки, они не попадут в rm
. Одинарные кавычки ?
не будут рассматриваться как подстановочный знак, они будут переданы в rm
буквальном смысле. Незаключенные в кавычки *
будут рассматриваться как подстановочный знак, они будут соответствовать любой строке запроса, оболочка передаст возможно несколько совпадающих имен файлов в качестве аргументов в rm
.
решение2
Если '
является частью имени ваших файлов, я рекомендую использовать команду find вместе с " "
передачей шаблона имени для вашей команды.
Вот пример, который вы можете использовать:
find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;