BASH: Получить день от dd_mm_yyy для имени файла с регулярным выражением - PullRequest
0 голосов
/ 22 февраля 2020

У меня много файлов (около 50 КБ), и мне нужно хранить их в определенной папке c для каждого дня, когда они были созданы. День создания должен быть взят из его имени, которое выглядит примерно так:

normal_007a02ece6e249d2_940163493_210061_user_sector_23938_22-46-58_2019-12-10-00CA01DF-10270594-00000001.mp3

100 * * 1005 Есть некоторая дополнительная информация, но я должен переместить ее в папку 10, которая является 10-м днем ​​месяца. Итак, у меня есть 31 папка (1-31), и я должен переместить каждый файл в соответствующую папку дня. Любая подсказка, как я мог сделать это?

Редактировать: Это то, что я пытаюсь:

pattern ='(normal_[A-Za-z0-9].*_[A-Z].*_[0-9]{5}_[0-9]*-[0-9]*-[0-9]*_([0-9]*)-([0-9]*)-([0-9]*).*)'

    for file in *.mp3
    do
       # echo $file

      if [[ $file =~ $pattern ]]; then
            echo "Match ${BASH_REMATCH[0]}"
    fi

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

У вас неправильный шаблон. Для примера, который вы дали, это похоже на совпадение, но у меня недостаточно данных, чтобы убедиться:

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 вместо фактической даты .

0 голосов
/ 22 февраля 2020

Чтобы извлечь строку вида dddd-dd-dd, где d - это ди git, вы можете использовать GNU grep. Затем вы можете прочитать дату в переменные y, m и d:

str=$(grep -Po "\d{4}-\d{2}-\d{2}" <(echo normal_2019-12-10-00.mp3))
read y m d < <(date -d $str "+%Y %m %d")
echo $y.$m.$d
2019.12.10

Для извлечения даты типа yyyy-mm-dd из строки требуется более сложное регулярное выражение, как описано в " Регулярное выражение для проверки формата даты дд / мм / гггг"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...