У меня есть небольшая проблема. Один клиент поручил мне перенести сайты с очень старого сервера. Не знаю, как они туда попали, но есть файлы с '
именами. Есть ли способ переименовать файл? mv
кажется, не делает трюк.
ls
показывает это как 90843_O\\'ConnorPaul_GeneralManager.jpg
Когда я пытаюсь
mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
он ничего не делает с >
новой строкой, как будто ожидает большего ввода.
Если я попробую
mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Я получаю ошибку
mv: not stat '90843_O \' ConnorPaul_GeneralManager.jpg ': нет такого файла или каталога
Кроме того , есть простой способ изменить \'
для _
всех файлов в определенной папке?
vidir
это простое решение подобных проблем.Ответы:
Завершение вкладки Bash должно быть в состоянии сделать правильную вещь здесь, если вы просто напечатаете
mv 90843_O
и нажмите Tab. В противном случае, один из способов избежать имени:Двойные кавычки устраняют необходимость в экранировании
'
, но два символа обратной косой черты все еще необходимо экранировать (одна дополнительная обратная косая черта для каждого создает четыре обратной косой черты). Другой вариант:Здесь размещение обратной косой черты в одинарных кавычках избавляет от необходимости избегать их, но вам нужно завершить одинарные кавычки, чтобы добавить литерал
'
. Экранируется после окончания кавычек.Обратите внимание, что проблема здесь связана с наличием обратной косой черты в имени, как и с одинарной кавычкой Чтобы заменить
\\'
последовательность (поскольку в названии файла есть две обратные косые черты, обе будут вызывать проблемы), подчеркивание для всех файлов в каталоге с использованием цикла:-i
Сделаетmv
подсказку , если какие - либо файлы будут перезаписаны. Используяprename
(rename
ссылки на это во многих системах):Удалить,
-n
когда вы счастливы, он делает то, что вы хотите. Обратите внимание, что здесь символы обратной косой черты должны быть экранированы внутри выражения perl, даже если вокруг них есть одинарные кавычки (без одинарных кавычек вам потребуется восемь обратных слешей, поскольку четыре будут удалены оболочкой и не будут частью выражения perl).источник
Вы можете использовать
rename
для таких задач:Если вы хотите заменить
'
для_
также можно использовать переименование:источник
Grrr, @Graeme опередил меня, но я все равно отправлю ...
Если вы заключите имя файла в двойные кавычки, например
mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
, это поможет; использование не-v
является обязательным, но он расскажет, что он сделал. Я полагаю, что есть и второй путь, кроме того, чтобы избежать всех символов, если это возможно. Единственный недостаток этого способа, который я знаю, заключается в том, что оболочка будет обрабатывать текст, поскольку он не заключен в одинарные кавычки, но он совсем не манипулирует им, поскольку это не внутренний код, а дополнительное время, необходимое для обработки, не имеет смысла.Только что протестированный, вы можете иметь символ как
>
в двойных кавычках, и он будет принят как часть имени файла.В качестве подсказки на будущее, вы можете использовать
./
прямо перед именем файла, если оно вызывает проблемы, например, файлы, начинающиеся с тире:mv ./-file file
будут переименованы-file
вfile
. В таком случае вы не можете ни цитировать, ни экранировать имя файла, как исключение.Как ни странно, я мог бы создать файл,
90843_O'ConnorPaul_GeneralManager.jpg
если бы избежал одинарной кавычки\'
, но он не смог бы создать его, если бы он не был заключен в двойные кавычки или экранирован.PS: Завершение Bash - это еще один способ, он работал с проблемой имени файла в вашем файле, но он не будет работать с «черточными» файлами / папками: просто напишите часть имени и нажмите Tab, он сделает все остальное.
источник