使用 find 删除指向目录的符号链接

Using find to delete symbolic links except those which point to directories

目前我递归地删除了我当前工作目录中的所有软链接,如下所示:

find . -type l -delete

但我不想再删除指向目录的符号链接。

是否有自定义查找命令的简单方法,或者我是否必须省略 -delete 并编写一些脚本以在删除之前检查每个找到的软链接“我自己”?

正如评论中已经建议的那样,您可以为此使用 test 实用程序;但你不需要 readlink 因为 test -d 总是解析符号链接。

# replace -print with -exec rm {} +
find . -type l ! -exec test -d {} \; -print

由于为每个符号链接生成新进程的开销,它可能会很慢。如果这是一个问题,您可以在查找命令中加入一个小的 shell 脚本来批量处理它们。

find . -type l -exec sh -c '
for link; do
  shift
  if ! test -d "$link"; then
    set "$@" "$link"
  fi
done
# remove echo
echo rm "$@"' sh {} +

或者,如果您安装了 GNU find,您可以使用 -xtype 主。

# replace -print with -delete
find -type l ! -xtype d -print