Сортировка файлов по имени файла

Сортировка файлов по имени файла

Я пытаюсь отсортировать файлы по шаблону в имени файла, создав Linux Script (Bash).

Мои файлы в основном .JPG, некоторые .AV и .MP4. Я не могу использовать метатеги, потому что эти файлы имеют сломанные теги (восстановленные после сбоя RAID).

Большинство моих файлов имеют такие теги, как Seaxxx_A01_xxx.jpg или Beach_xxx_A01A02_xxx.jpg или Mountain_xxx_A04A12_xxx.jpg (это моя ссылка на то, кто сделал фотографии и на какое устройство, например: фотоаппарат, зеркалка и т. д.).

Мне нужно поместить файл в правильную папку и подпапку в зависимости от имени файла.

Я думаю, что эту задачу можно решить следующим образом:

используйте поиск, найдите шаблон [AZ][0-2][0-6] или [AZ][0-2][0-6][AZ][0-2][0-6], когда этот шаблон будет найден, найдите первую часть имени файла (например, Sea, beach, mountain, family и т. д., всегда помещаемые в качестве первых слов, обычно у меня нет ничего другого) и используйте первую часть для поиска папки с похожим именем и поместите ее (если мой файл содержит: Sea_Royan_xxx_A04A10_xxx.jpg и у меня есть только папка с именем «Sea», его нужно поместить в эту папку).

В каждой папке присутствуют подпапки, например A01, A02, A03, A04 или Dio, Sandy, Mael и т. д., и я хочу, чтобы текущий найденный файл (то есть тот же, что был помещен в родительскую папку, Sea, Mountain и т. д.) проверялся на наличие второго шаблона, указанного выше, для помещения в нужную подпапку.

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

Дайте мне знать, как это сделать (я знаю, как искать файлы по шаблону, но не знаю, как прочитать текущее найденное имя файла и по этому имени проверить два шаблона, которые будут использоваться в качестве правильного PATH). Если у вас есть более простой или лучший способ сделать это, не стесняйтесь, дайте мне знать!

решение1

Вот один из возможных подходов, который, вероятно, не самый красивый и не самый оригинальный. Идея заключается в использовании регулярных выражений в awk для извлечения соответствующих битов из имен файлов. Затем мы переходим к построению команды shell move (mv) в awk. Наконец, мы используем системную команду, доступную в awk, для выполнения команды и перемещения файлов в соответствующие подпапки.

Попробуйте сначала сделать это, чтобы получить подробное описание:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'

Результат:

Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02

Чтобы фактически выполнить команду, добавьте system(cmd) в конец оператора:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'

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

Начиная с начала имени файла, мы захватываем все, что не является подчеркиванием, пока не найдем одно подчеркивание. Затем мы продолжаем поиск, пока не найдем шаблон A#####, где # представляет собой буквы/цифры (вторая группа захвата). Мы захватываем, пока не найдем следующее подчеркивание.

Связанный контент