Переименование файла, который получил кавычку 'в его названии

11

У меня есть небольшая проблема. Один клиент поручил мне перенести сайты с очень старого сервера. Не знаю, как они туда попали, но есть файлы с 'именами. Есть ли способ переименовать файл? 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 ': нет такого файла или каталога

Кроме того , есть простой способ изменить \'для _всех файлов в определенной папке?

Игорь Явыч
источник
1
Если у вас есть moreutils , vidirэто простое решение подобных проблем.
Дероберт

Ответы:

6

Завершение вкладки Bash должно быть в состоянии сделать правильную вещь здесь, если вы просто напечатаете mv 90843_Oи нажмите Tab. В противном случае, один из способов избежать имени:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

Двойные кавычки устраняют необходимость в экранировании ', но два символа обратной косой черты все еще необходимо экранировать (одна дополнительная обратная косая черта для каждого создает четыре обратной косой черты). Другой вариант:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

Здесь размещение обратной косой черты в одинарных кавычках избавляет от необходимости избегать их, но вам нужно завершить одинарные кавычки, чтобы добавить литерал '. Экранируется после окончания кавычек.

Обратите внимание, что проблема здесь связана с наличием обратной косой черты в имени, как и с одинарной кавычкой Чтобы заменить \\'последовательность (поскольку в названии файла есть две обратные косые черты, обе будут вызывать проблемы), подчеркивание для всех файлов в каталоге с использованием цикла:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

-iСделает mvподсказку , если какие - либо файлы будут перезаписаны. Используя prename( renameссылки на это во многих системах):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Удалить, -nкогда вы счастливы, он делает то, что вы хотите. Обратите внимание, что здесь символы обратной косой черты должны быть экранированы внутри выражения perl, даже если вокруг них есть одинарные кавычки (без одинарных кавычек вам потребуется восемь обратных слешей, поскольку четыре будут удалены оболочкой и не будут частью выражения perl).

Graeme
источник
4

Вы можете использовать renameдля таких задач:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Если вы хотите заменить 'для _также можно использовать переименование:

rename "s/\'/_/g" *
Braiam
источник
-2

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, он сделает все остальное.

rautamiekka
источник
Почему понизить? Я писал раньше других, но я не был достаточно быстр, чтобы опубликовать его первым.
rautamiekka
Это был не я. Понятия не имею, кто за проголосовал.
Игорь Явыч
1
Этот ответ не верен, он игнорирует обратную косую черту в имени файла, с которой на самом деле сложнее справиться, чем с одинарной кавычкой.
Грэм