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

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

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

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

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

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

Этот скрипт выполняется ежедневно в полночь. Поэтому каждую полночь создаются эти папки.

(Это означает, что папка назначения всегда уже существует перед копированием.)

И некоторые видеофайлы скачиваются. В именах этих файлов есть дата.

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

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

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

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


[Расположение каталога]

Путь к файлам, которые я хочу скопировать: /volume1/video/

Пример целевого каталога: /volume1/video/daily/2020-04-06(Mon)


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

Если вы мне объясните, пожалуйста, включите путь к каталогу в моем случае, как указано выше.

(потому что я не могу применить код, который вы мне рекомендуете, из-за отсутствия понимания. Прошу прощения)

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

решение1

Попробуй это,

for f in /volume1/video/*; do
  # skip over directories
  [ -f "$f" ] || continue
  # grep the date in YYMMDD format
  date=$(printf '%s' "$f" | grep -Eo '[0-9]{6}')
  # set target path using date to convert YYMMDD to YYYY-MM-DD(%a)
  target="/volume1/video/daily/$(date -d "$date" +%Y-%m-%d\(%a\))/"
  # mv the file
  echo mv "$f" "$target"
done
  • Уберите эхо, когда оно работает.
  • Возможно, было бы неплохо добавить проверку, чтобы увидеть, $dateне пусто ли.
  • Вы можете добавить mkdir -p "$target"перед , mvчтобы избежать ошибок из-за отсутствующих каталогов.
  • Примечание: в этом коде есть ошибка тысячелетия ;-)

решение2

Только что создал скрипт, который я также протестировал:

#!/bin/bash

SOURCE_FOLDER="video/"
TARGET_FOLDER="video/daily" # Not used as it is under the source folder.

doMove() {
    # Year loop assuming AFTER 2000 up to 2022
    cd "$SOURCE_FOLDER"
    for i in 20{19..20} ; do
        #echo -e "/nWorking on 20$1"
        # Month Loop
        for j in 0{1..9} {10..12} ; do
            # Day Loop
            for k in 0{1..9} {10..31} ; do
                # Find files matching YYMMDD
                file=$(find . -maxdepth 1 -type f -print | grep $i$j$k)
                # For each found file:
                for sf in $file ; do
                    # Find the folder with a different format
                    folder=$(find * -type d -print | grep $i-$j-$k)
                    echo -e "\nFile: $sf"
                    echo -e "Folder: $folder"
                    mv "$sf" "$folder/" # 2> /dev/null
                    echo -e "Moved $sf to $folder"
                done
            done
        done
    done
    cd .. # Change to your needs.
}
doMove

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