我有一个目录,其中转储了大量数据,并且我想找到其内容最近未修改的所有目录(例如,在过去 5 天内)。我正在尝试编写一个调用来find
执行我正在寻找的操作,但我开始怀疑这是否比 find 可以处理的更复杂。这是我尝试过的,但并没有达到我的预期:
find "$DUMP_DIR" -type d -d 2 \
-execdir bash -c 'find . -mtime -5 >/dev/null 2>&1' \; \
-prune
目录结构的布局大致如下$DUMP_DIR/category{1,2,3,4,5}/thing*
。我想知道thing*
最近哪些目录中转储了新数据。天真的解决方案find "$DUMP_DIR" -type d -d 2 -mtime +5
将比我想要的更匹配。
我预计该-execdir
表达式会找出任何目录是否包含过去五天内修改的内容(如果没有找到任何内容,则返回非零),但我想它并不能完全做到这一点。
我一直坚持在 OS X 上安装 BSD find。我也不想安装任何不属于标准命令行实用程序的东西。做到这一点最合理的方法是什么?
答案1
我相信这会满足您的需要。它依次查看每个目录并检查是否有“最近修改的”文件。
find * -type d |
while read DIR
do
LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 -print -quit)
test -z "$LINES" && echo "$DIR NOT RECENTLY MODIFIED"
done
如果find ... -maxdepth 1
不适合您的情况,请随意将其更改为类似这样的内容
LINES=$(find "$DIR" \( -type d -prune \) -o \( -type f -mtime -5 -print -quit \))
如果您想计算最近修改的项目数(或者如果-quit
不可用),这将起作用
LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 | wc -l | tr -d' ')
test 0 -eq "$LINES" && echo "$DIR NOT RECENTLY MODIFIED" || echo "$DIR has $LINES recent file(s)"
答案2
如果我正确理解了这个问题,这可以很简单地完成
find . -mtime +5 -exec bash -c 'echo "${0%/*}"' {} \; | sort | uniq