![如何根据文件的时间戳(每月的日期)将文件复制到另一个目录?](https://linux22.com/image/156878/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E7%9A%84%E6%97%B6%E9%97%B4%E6%88%B3%EF%BC%88%E6%AF%8F%E6%9C%88%E7%9A%84%E6%97%A5%E6%9C%9F%EF%BC%89%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
假设我在 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
答案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}'`
我只考虑了两天,目录位于同一路径上。请添加其他日期,如果目录是另一个文件夹,则也添加它。
另一个假设是文件名中没有空格。