Я пытаюсь отсортировать свои файлы по шаблону в имя файла, создав 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), если у вас есть более простой способ или лучший способ сделать это, не стесняйтесь сообщить мне об этом!
Вот один из возможных подходов, который, вероятно, не самый красивый и не самый оригинальный. Идея состоит в том, чтобы использовать регулярные выражения в 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 #####, где # представляют буквы / цифры (вторая группа захвата). Мы захватываем, пока не дойдем до следующего символа подчеркивания.