Скопируйте файл, содержащий дату в имени файла, в папку для этой даты.

Скопируйте файл, содержащий дату в имени файла, в папку для этой даты.

Я новичок в Stack Overflow.

Мне нужна ваша помощь. Спасибо за ответ заранее.

Я искал похожие вопросы, но в моем случае было сложно получить четкий ответ.

Я использую Synology DS1515+ и DSM 6.2.2.

Прежде всего, я создал ежедневную папку, содержащую дату, используя скрипт, как показано ниже;

mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))

Этот скрипт выполняется ежедневно в полночь.

И некоторые видеофайлы скачиваются. Эти имена файлов содержат дату

Например, ABCDABCD.200328.avi или EFGHIJKH.200327.1080p.mp4

Имена файлов не имеют определенных правил, но дата включена в каждое имя файла типа ГГММДД.

Я хотел бы скопировать эти файлы в папки, содержащие ту же дату.

(папка, которая создается автоматически, как я объяснил выше)

Не могли бы вы помочь или объяснить, как это сделать?

Спасибо большое еще раз. Хорошего дня.

решение1

Если я правильно вас понял, вы можете попробовать это с помощью grepGNU date:

shopt -s nullglob
for file in *.avi *.mp4; do 
  dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
  if [[ $(date "+%y%m%d" -d "$dat") ]]; then
    dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
    cp "$file" "$dir"
  fi
done

решение2

Одной из возможностей было бы использование GNU Awk ( gawk), который имеет встроенные функции манипулирования временем. Например (предполагая, что если у вас есть gawk, у вас также есть реализации GNU cpи mv)

printf '%s\n' *.mp4 *.avi | gawk -F. '
  {
    datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2)); 
    cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
    system(cmd)
  }
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi

Удалите , echoкак только вы будете довольны тем, что он делает правильно. Измените cpна mv, если вы хотите переместить, а не копировать.

Другим вариантом для случая перемещения может быть (аб)использование утилиты на основе Perl rename:

$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/") . $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)

Здесь удалите -nпосле тестирования.

решение3

Если вы cdперейдете в папку, где хранятся видеофайлы, то вы сможете переместить файлы с помощью следующей команды:

mv -v *YYMMDD* /path-to-new-folder

Это использует сопоставление с образцом для перемещения только тех файлов, которые имеют этот формат даты в имени файла. Я обычно использую эту -vопцию, поэтому команда выводит подробную информацию, так что вы знаете, что она что-то сделала.

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