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