Перейменування файлу, який отримав лапку в своїй назві


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: не може стати статистикою '90843_O \' ConnorPaul_GeneralManager.jpg ': такого файлу чи каталогу немає

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


1
Якщо у вас є додаткові утиліти , vidirце просте рішення таких питань.
дероберт

Відповіді:


6

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

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).


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" *

-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

Чи не я. Немає поняття, хто проголосував.
Ігор Явич

1
Ця відповідь неправильна, вона ігнорує зворотні риски в імені файлу, з якими насправді важче розібратися, ніж з однією цитатою.
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.