我的目录中有以下内容:
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
有几个问题:
readlink -f
返回绝对路径,-path
需要前缀为 的相对路径./
。- 某些版本的
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