内容不早于 30 天的顶级文件夹列表

内容不早于 30 天的顶级文件夹列表

我有一个用于创建 FTP 帐户的自动化系统(带有被监禁的虚拟用户的 vsftpd),该系统运行良好,但我仍然依赖于手动清理过时的帐户。

我对过时帐户的定义是,其中不存在保存时间少于 30 天的文件或文件夹。

到目前为止,我可以运行这个:

find /home/vsftpd -ctime +30 |awk -F'/' '{print $4}' |sort -u 

这会给我一个包含文件夹的列表最后一个超过 30 天的文件。我还可以使用-ctime -30and 运行,并进行一些重循环,否定该列表以获得我需要的信息。

我希望有一种方法可以作为(适度合理的)单行代码来做到这一点,但我的 find-foo 在这一点上失败了。有人可以帮忙吗?

答案1

我会做(使用 GNU find)类似的事情:

cd /home/vsftpd &&
for i in */; do
  if ! find "./$i" -ctime -30 -print -quit | grep -q .
    echo no file touched in the past 30 days in "$i"
  fi
done

(假设帐户位于 /home/vsftpd 下一级)

使用 zsh:

stale() (: $REPLY/**/*(NDm-30e:'exit 1':))
cd /home/vsftpd &&
  echo those are stale: *(/+stale)

答案2

如果您想要一个单行代码,请使用 zsh。它有点神秘,就像大多数高级用途一样全局限定符

echo *(/e\''set -- $REPLY/**/*(Nm-30[1]); ((!$#))'\')

外部 glob 仅匹配目录 ( ),使得单引号内的/表达式 ( ) 为 true。e该表达式使用匹配目录 ( $REPLY) 并在其下 ( **/) 查找最近 30 天内修改的文件 ( ) m-30,如果没有文件匹配 ( ),则不会导致错误N,并且仅保留第一个匹配项 ( [1])。如果没有匹配,则表达式为 true。

另一种方法是列出包含最近文件的目录,然后取列表的补集。

comm -13 <(find . -mtime -30 | sed -e '/^\.$/ d' -e 's~^\./~~' -e 's~/.*~~' | sort -u) \
         <(find . -type d -name . -o -prune -print | sed -e 's~^\./~~')

相关内容