如何根据星期几搜索文件

如何根据星期几搜索文件

实际上,我需要在每个月的星期五搜索 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%Y52012

或者,如果您更喜欢zsh-only 解决方案(非常相似, -stringe仅选择引号内的表达式返回的那些文件/目录真的):

zmodload zsh/stat
print -rl -- **/*(De_'[[ $(zstat -F "%u%Y" +mtime -- $REPLY) = "52012" ]]'_)

相关内容