У вас неправильный шаблон. Для примера, который вы дали, это похоже на совпадение, но у меня недостаточно данных, чтобы убедиться:
pattern='normal_[[:xdigit:]]{16}_[[:digit:]]{9}_[[:digit:]]{6}_[^_]*_[^_]*_[[:digit:]]*_[[:digit:]]*-[[:digit:]]*-[[:digit:]]*_([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})-[[:xdigit:]]{8}-[[:xdigit:]]{8}-[[:xdigit:]]{8}.mp3'
for file in *.mp3; do [[ $file =~ $pattern ]] && echo ${BASH_REMATCH[1]}/${BASH_REMATCH[2]}/${BASH_REMATCH[3]}; done
2019/12/10
2019/12/13
Однако мой подход к этому был бы другим. используйте find, чтобы найти файлы и сгенерировать дату последовательно.
for ((i=1;i<=31;i++)) ;
do
DATE=$(date -d "2019-11-30 +$i days" +%Y-%m-%d);
find -regextype posix-egrep \
-iregex '.*normal_[[:xdigit:]]{16}_[[:digit:]]{9}_.*'$DATE'-[[:xdigit:]]{8}-[[:xdigit:]]{8}-[[:xdigit:]]{8}.mp3'
-exec echo mv --target-directory=/some/absolute/path/${DATE//-/\/}/ {} +; done
mv --target-directory=/some/absolute/path/2019/12/10/ ./normal_007a02ece6e249d2_940163493_210061_user_sector_23938_22-46-58_2019-12-10-00CA01DF-10270594-00000001.mp3
mv --target-directory=/some/absolute/path/2019/12/13/ ./normal_007a02ece6e249d2_940163493_210061_user_sector_23938_22-46-58_2019-12-13-00CA01DF-10270594-00000001.mp3
Краткое объяснение:
- при этом будут выполняться поиск файлов, соответствующих регулярному выражению с включенным жестким кодом $ DATE (настроить ваша начальная дата и максимальное значение для разных диапазонов)
- с использованием
-exec {} +
он переместит пакеты файлов в каталог (для простоты это та же дата) - удалит эхо, когда вы действительно убедитесь, что результаты в порядке.
- проверьте еще раз регулярное выражение
Редактировать: если вы хотите иметь иерархическую структуру (год / мм / дд), вы можете использовать замену шаблона для date (${DATE//-/\/}
- заменяет все тире на /
), либо используйте $ i напрямую и ограничьте себя месяцем.
Другой подход - использовать -mtime / -ctime вместо фактической даты .