使用递归“ls”排除特定目录

使用递归“ls”排除特定目录

我一直在使用以下命令列出特定目录中最近更新的文件(递归地)并按修改时间排序:

$ 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)

相关内容