我一直在使用以下命令列出特定目录中最近更新的文件(递归地)并按修改时间排序:
$ stat --printf="%y %n\n" $(ls -tr $(find * -type f))
然而,在层次结构中,有一个目录充满了几乎每分钟更新的文件,这使得上述命令对于查找有问题的目录之外的文件几乎毫无用处。
我尝试使用该ls -I
标志但无济于事:
$ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f))
有没有一种简单的方法可以使用命令排除单个/特定目录ls
?或者我应该将搜索推入find
命令中?
答案1
你不需要那个额外的ls -tr
。这相当于你的命令并且更快:
find . -type f | xargs stat --printf="%y %n\n" | sort -n
像这样的东西将排除文件的子目录:
find . -type f ! -path './directory/to/ignore/*' \
| xargs stat --printf="%y %n\n" \
| sort -n
如果您想忽略整个子目录,这仍然会检查每个文件,请使用-prune
.您必须稍微重新排序,以免我们首先找到所有文件。
find . -path './directory/to/ignore' -prune -o -type f -print0 \
| xargs -0 stat --printf="%y %n\n" \
| sort -n
为了尽可能高效,stat
鉴于 find 已经在访问文件,这是多余的。因此,您实际上使用该方法对文件系统造成了 2 倍的影响,find ... | stat ...
因此这里有一种更有效的方法可以find
完成所有工作。
find . -path './directory/to/ignore' -prune -o -printf '%t %p\n'
| sort -n
为了使这个版本工作,我必须调整 printf 指令,stat
并对find
各种文件系统元数据使用不同的指令。
参考
答案2
和zsh
:
stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)