вторник, 3 июля 2018 г.

Переименование группы файлов в Linux по списку средствами утилиты awk

Появилась как-то задача, в которой нужно было переименовать большую группу файлов по заданному списку.

Список выглядел примерно так:

11118.png 001.png
11556.png 002.png
21118.png 003.png
11117.png 004.png
11104.png 005.png
11710.png 006.png
11551.png 007.png
11868.png 008.png
11557.png 009.png
710.png 010.png
11113.png 011.png
11873.png 012.png
21331.png 013.png
11102.png 014.png
21400.png 015.png
11111.png 016.png
4.png 017.png

причем, справа - текущие имена файлов, слева - целевые, т.е. те, на которые имена файлов нужно изменить.

Вообще, с переименованием файлов в Linux отлично справляется программа на Python с названием pyRenamer. Однако, такой опции чтобы эта программа на входе брала файл списка, я не нашел.

Что ж, Linux как известно имеет множество инструментов для работы со строками, с данными.

Есть встроенные средства оболочки, утилиты perl, sed, awk. Наверное, есть возможность и на python это сделать.

В своем случае я воспользовался утилитой awk, мне она показалась простой и удобной.

Итак, помещаем в каталог с файлами для переименования файл-описание, где построчно описаны правила переименования (смотри выше).
Переходим в этот каталог и выполняем команду

awk -F' ' 'system("mv " $2 " " $1)' errot_code_table_2.csv

где
awk - утилита
-F' ' - разделитель имен файлов, в моем случае это пробел
system(x) - выполнение кода х в сабшелле
mv - команда переименования
$2 - второй параметр (вторая колонка файла-описания)
$1 - первый параметр (первая колонка файла-описания)
errot_code_table_2.csv - файл описание