假设我在 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}'`
我只考虑了两天,目录位于同一路径上。请添加其他日期,如果目录是另一个文件夹,则也添加它。
另一个假设是文件名中没有空格。