
我是堆栈溢出的新手。
我需要你的帮助。感谢您提前回复。
我寻找类似的问题,但在我的案例中很难得到明确的答案。
我使用 Synology DS1515+ 和 DSM 6.2.2。
首先,我使用如下脚本创建了包含日期的每日文件夹;
mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))
该脚本在每天午夜执行。
并且下载了一些视频文件。这些文件名包含日期
例如,ABCDABCD.200328.avi 或 EFGHIJKH.200327.1080p.mp4
文件名没有特定的规则,但 YYMMDD 类型的每个文件名中都包含日期。
我想将这些文件复制到包含相同日期的文件夹中。
(文件夹自动生成的内容如上面我解释的)
您能帮忙或解释一下如何做吗?
再一次非常感谢你。祝你有美好的一天。
答案1
如果我理解正确的话,你可以用 GNU 尝试grep
一下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
一种可能性是使用gawk
具有内置时间操作函数的 GNU Awk ( )。例如(假设如果您有gawk
,那么您也有cp
和的 GNU 实现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
移动案例的另一个选择可能是(ab)使用基于 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
选项,因此该命令会详细地打印出来,这样您就知道它已经做了一些事情。