如何根据文件的时间戳(每月的日期)将文件复制到另一个目录?

如何根据文件的时间戳(每月的日期)将文件复制到另一个目录?

假设我在 dir1 中有这些文件:

-rw-r--r--  1 user user  10240 Jul  2 11:54 10_data.txt
-rw-r--r--  1 user user  36048 Jul  4 11:56 95_data.txt
-rw-r--r--  1 user user  35634 Jul  7 11:56 01_data.txt
-rw-r--r--  1 user user  10630 Jul  9 11:56 19_data.txt
-rw-r--r--  1 user user  35476 Jul  9 11:57 93_data.txt

我希望能够根据时间戳复制这些文件,特别是一个月中的某一天(2、4、7 和 9)。

前任:

copy 10_data.txt into a directory called 02
copy 19_data.txt into a directory called 09
copy 93_data.txt into a directory called 09

目标目录(01、02、03 等)已经存在,因此无需创建它们或任何内容。我计划每天午夜后将其作为 cron 作业运行。

我可以find与此任务一起使用(date +%d)或类似的东西吗?

谢谢你!

答案1

如果你有 zsh 可用,你可以用它来做到这一点zstat模块:

zmodload zsh/stat
for f in *.txt
do
  cp -p -- "$f" $(zstat -F %d +mtime "$f")/
done

zstat -F %d +mtime命令要求格式化输出 ( -F %d)每月的某一天文件的修改时间。生成的十进制数范围为 01 到 31,并用作命令的目标cp

答案2

stat是您查找文件修改时间、文件大小或大多数ls显示的文件属性的朋友。

例如,在 FreeBSD 上,stat -f %Sm -t %d -- foo将显示文件最后一次修改的日期foo,这似乎就是您所查找的内容。

不需要find,您可以直接迭代文件,例如本bash例:

for f in *; do
  d=$(stat -f %Sm -t %d -- "$f")
  cp -p -- "$f" $d/
done

回应您的评论,即您的目标操作系统是 RedHat,看来 RedHat 的stat实用程序不具备 FreeBSD 的格式化灵活性。您可以比较手册页这里

您可能会发现该命令date -r foo "+%d"是合适的替代品。脚本的相关行将变为:

  d=$(date -r "$f" "+%d")

答案3

你可以这样尝试。我测试过。应该有效

cp `ls -ltrh *txt  | awk '{if($7=2){print $NF}}'` `ls -ltrh *txt  | awk '{print $7}'`

我只考虑了两天,目录位于同一路径上。请添加其他日期,如果目录是另一个文件夹,则也添加它。

另一个假设是文件名中没有空格。

相关内容