Як пакетно перейменувати файли (зображення) на основі файлу CSV


11

Що я маю і хочу досягти:

  1. В одній папці є тисячі зображень.

  2. У мене файл CSV із такими стовпцями:

    A: оригінальна назва B: перейменоване ім'я

    Типовий рядок виглядає приблизно так:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"
    

    Я можу прибрати цитати, це не проблема.

  3. Тепер я хочу використовувати додаток або запустити скрипт, який шукатиме всі зображення у стовпці А та перейменовує їх на імена у стовпці B (наприклад, оригінал-1.jpg -> перейменовано-1.jpg).

Є відповіді, наприклад:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Однак, тут є деякі сценарії, і я не впевнений, чи всі ці сценарії впливають лише на папку, в якій ви зберігаєте скрипт, або вони можуть перейменувати всі файли на диску, які відповідають певним умовам. Звичайно, останнього потрібно уникати.

Що я шукаю, це простий посібник, як перейменувати файли та як вибрати папку з файлами.

Спасибі заздалегідь.

Відповіді:


13

Це повинно працювати для вас:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Пояснення:

  • sed 's/"//g' files.csv : видаліть цитати
  • IFS=, : розділити вхід на ,
  • while read orig new; do ... done: Це прочитає кожен рядок введення, розділить його на значення $IFS(тут кома) і збереже 1-е поле як, $origа решта як $new.
  • mv "$orig" "$new" : це перейменовує файли за запитом.

Якщо ваш файл містить лише імена файлів (на зразок orig.jpg) і немає шляхів (не /home/take2/orig.jpgчи подібних), команда вище вплине лише на файли у вашому поточному каталозі. Отже, вам потрібно відкрити термінал, cdдо цільового каталогу і запустити його там.

Перший тест:

Щоб перевірити це, ви можете спочатку виконати сухий запуск, роздрукувавши команди, які будуть запускатися, не виконуючи їх фактично:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

Чудово, це пояснюється краще. :) Просто перевірити, перш ніж запустити його - я повинен перейти на цільовий каталог і запустити цей рядок, або мені потрібно зберегти цей рядок як example.sh, а потім запустити "example.sh" з терміналу?
бери2

@ take2 ви можете просто запустити лінію прямо. Я оновив відповідь способом побачити, що буде працювати без фактичної зміни ваших файлів, рекомендую вам зробити це спочатку.
тердон

Чудово, це працює! Ще одне - чи не байдуже, які є мітки стовпців (вони є "orig" та "new" на даний момент) чи це просто перейменовує імена стовпця A у стовпці B імена?
беруть2

@ take2 які мітки? Ні, він просто бере перше поле, розділене комами, і перейменовує його на друге. Зауважте, що якщо є більше двох полів, воно буде перейменовано на решту рядка. Поки ваш вхідний файл схожий на те, що ви розмістили, він буде працювати, як очікувалося.
тердон

Btw. Термінал також відображає "mv: не може стати" orig ": немає такого файлу чи каталогу", хоча він перейменував файл.
бери2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.