如何在 Linux 中使用“查找”命令按路径排除某些文件夹?

如何在 Linux 中使用“查找”命令按路径排除某些文件夹?

我的目录中有以下内容:

1/
2/
3/
4/
5/
active -> 1
previous -> 2

这些是文件夹,以及指向文件夹的两个符号链接。我想删除符号链接中未指向的所有文件夹,而不是删除符号链接。我尝试过以下方法

find . -maxdepth 1 -mindepth 1 -type d -not -path "$(readlink -f active)" -not -path "$(readlink -f previous)"

这仍然返回我想要排除的两个目录。这是怎么回事?

答案1

有几个问题:

  1. readlink -f返回绝对路径,-path需要前缀为 的相对路径./
  2. 某些版本的readlink返回带有符号链接尾部斜杠的路径,该路径被拒绝find(在 Ubuntu 上测试,在 Gentoo 上无法重现)。

这在 Ubuntu 上对我有用,但它可能不是最优雅的解决方案:

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(readlink active | sed "s/\/$//")" -not -path "./$(readlink previous | sed "s/\/$//")"

这是一个稍微更简单的替代方案,使用realpath,在 Gentoo 上测试过;它可能是更便携的:

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(realpath --relative-to=. active)" -not -path "./$(realpath --relative-to=. previous)"

答案2

由于您已经在使用一些 GNUism(-not-mindepth-maxdepth),您可以这样做:

find -L . -mindepth 1 -maxdepth 1 -type d ! -xtype l \
  ! -samefile active ! -samefile previous

然后,您不必依赖符号链接目标的正确形式(./1如果使用find .、 not 1、nornor ././1/path/to/1并转义其中的通配符(如果符号链接是 to *,您需要一个-path './[*]')。

或者与zsh

print -rl ./*(D/e:'[[ ! $REPLY -ef active && ! $REPLY -ef previous ]]':)

答案3

find为什么不只在您感兴趣的目录中运行,而不是尝试过滤掉其他目录?

$ find ./active/ ./previous/

或者

$ find "./$(readlink active)" "./$(readlink previous)" -maxdepth 0
./1
./2

或者如果你的意思是你想要find完全匹配符号链接指向:

$ find . -mindepth 1 -maxdepth 1  -type d  -not -path "./$(readlink active)" -not -path "./$(readlink previous)"
./3
./4
./5

相关内容