使用 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
目前我递归地删除了我当前工作目录中的所有软链接,如下所示:
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