我寻找类似的问题,但在我的案例中很难得到明确的答案。
我使用 Synology DS1515+ 和 DSM 6.2.2。
首先,我使用如下脚本创建了包含日期的每日文件夹;
mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))
该脚本在每天午夜执行。所以每天午夜,都会制作这些文件夹。
(这意味着目标文件夹在复制之前始终已经存在。)
并且下载了一些视频文件。这些文件名包含日期。
例如,ABCDABCD.200328.avi 或 EFGHIJKH.200327.1080p.mp4
文件名没有一定的规则,但每个文件名中都包含类似 YYMMDD 类型的日期。
我想将这些文件复制到包含相同日期的文件夹中。
(文件夹自动生成的内容如上面我解释的)
[目录位置]
我要复制的文件路径:/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