Как пакетно переименовать файлы (изображения) на основе файла CSV

11

Чего я хочу и хочу достичь:

  1. В одной папке тысячи изображений.

  2. У меня есть файл CSV со следующими столбцами:

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

    Типичный ряд выглядит так:

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

    Я могу удалить цитаты, это не проблема.

  3. Теперь я хочу использовать приложение или запустить скрипт, который будет искать все изображения в столбце A и переименовывать их в имена в столбце B (например, original-1.jpg -> renamed-1.jpg).

Есть несколько ответов, например:

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

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

Тем не менее, есть некоторые сценарии, и я не уверен, что все эти сценарии влияют только на папку, в которой вы храните сценарий, или они могут переименовать все файлы на диске, которые удовлетворяют определенным условиям. Конечно, последнего следует избегать.

То, что я ищу, это простое руководство, как переименовать файлы и как выбрать папку с файлами.

Заранее спасибо.

Take2
источник

Ответы:

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 
terdon
источник
Отлично, это объясняется лучше. :) Просто чтобы проверить перед запуском - мне нужно перейти в целевой каталог и запустить эту строку, или мне нужно сохранить эту строку как example.sh, а затем запустить «example.sh» из терминала?
take2
@ take2 вы можете просто запустить линию напрямую. Я обновил ответ, чтобы увидеть, что будет запущено без фактического изменения ваших файлов, я рекомендую вам сначала это сделать.
тердон
Замечательно, это работает! Еще одна вещь - это заботится о том, каковы метки столбцов (на данный момент они являются «orig» и «new»), или просто переименовывает имена столбцов A в имена столбцов B?
take2
@ take2 какие ярлыки? Нет, он просто берет первое разделенное запятыми поле и переименовывает его во второе. Обратите внимание, что если имеется более двух полей, он переименует его в остальную часть строки. Пока ваш входной файл похож на то, что вы опубликовали, он будет работать как положено.
Тердон
Btw. Терминал также отображает «mv: not stat 'orig': Нет такого файла или каталога», хотя он и переименовал файл.
take2