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

nic*_*har 6 ls find recursive

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

$ 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命令中?

slm*_*slm 6

你不需要那个额外的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 指令,statfind为各种文件系统元数据使用不同的指令。

参考