实际上,我需要在每个月的星期五搜索 2012 年创建的文件和文件夹。
我使用该命令进行了一些尝试find
,但没有成功。
答案1
最简单的方法find
是:
find / -daystart -mtime +41 -mtime -408 \
-printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS %h/%f\n" |
awk '($7=="Fri"){print}'
根据需要调整-printf
,我让它看起来靠近ls -l
这里。
%T
( 和%A
%C
) 让您可以使用strftime()
时间戳格式,%Ta
即一周中的某一天。 (您可能需要调整日期范围 41 - 408,但这实际上只是一种优化,您可以只是grep 2012
, 或调整-printf
以使其更容易 grep。)
编辑:一个更强大的版本,但清晰度略有下降:
find / -daystart -mtime +41 -mtime -408 \
-printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS\0%h/%f\0\0" |
gawk 'BEGIN{RS="\0\0"; FS="[\0]"} ($1~/ Fri /) { printf $2 "\0"}' |
xargs -0 -n 1 -i ls -l "{}"
这模拟-print0
,但每一行都有两个\0
分隔字段,文件名是第二个。将ls -l "{}"
末尾替换为您需要对文件执行的任何操作。我明确使用gawk
,其他 awks 不会那么友好地对待RS
/中的 \0 字节FS
(也已更新以处理文件名中的换行符)。
另外,根据建议姆雷图布您可以使用%Tu
与%Ta
语言无关的选项,或者代替编号的工作日。
答案2
使用gnu
工具:
find . -exec bash -c '[[ $(date -r "$0" +%u%Y) = "52012" ]]' {} \; -print
-print
仅当前一个-exec
返回时,文件/目录名称才会被编辑真的,也就是说,如果按照指定格式 ( )mtime
报告的是date -r
%u%Y
52012
或者,如果您更喜欢zsh
-only 解决方案(非常相似, -stringe
仅选择引号内的表达式返回的那些文件/目录真的):
zmodload zsh/stat
print -rl -- **/*(De_'[[ $(zstat -F "%u%Y" +mtime -- $REPLY) = "52012" ]]'_)