Я искал похожие вопросы, но в моем случае было сложно получить четкий ответ.
Я использую 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