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

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

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

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

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

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

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

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

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

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

0
29.09.2016, 01:19
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 #####, где # представляют буквы / цифры (вторая группа захвата). Мы захватываем, пока не дойдем до следующего символа подчеркивания.

0
28.01.2020, 04:49

Теги

Похожие вопросы