将文件名中包含日期的文件复制到该日期的文件夹中

将文件名中包含日期的文件复制到该日期的文件夹中

我是堆栈溢出的新手。

我需要你的帮助。感谢您提前回复。

我寻找类似的问题,但在我的案例中很难得到明确的答案。

我使用 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选项,因此该命令会详细地打印出来,这样您就知道它已经做了一些事情。

相关内容