如何一次性删除文件夹中的所有符号链接(数十个)?使用 unlink 或 rm 时手动插入每个符号链接并不实际。
答案1
您可以使用find
-command 来执行此操作:
find /path/to/directory -maxdepth 1 -type l -delete
为了安全起见,请先检查是否不使用 -option -delete
:
find /path/to/directory -maxdepth 1 -type l
-maxdepth 1
确保find
只会在 中查找/path/to/directory
符号链接,而不会在其子文件夹中查找。请随意查看man find
。
答案2
列出当前目录别名文件夹中的链接并查看你确实想删除它们,
find -type l -ls # search also in subdirectories
find -maxdepth 1 -type l -ls # search only in the directory itself
如果情况看起来不错,而且你想删除这些链接,运行
find -type l -delete # delete also in subdirectories
find -maxdepth 1 -type l -delete # delete only in the directory itself
如果你想交互删除,你可以使用下面的命令行(这个比较安全)
find -type l -exec rm -i {} + # delete also in subdirectories
find -maxdepth 1 -type l -exec rm -i {} + # delete only in the directory itself
答案3
对于Z壳,rm *(@)
将实现这一目标。
Zsh 支持glob 限定符限制 glob(例如)适用的文件类型*
,例如(/)
目录、(x)
可执行文件、(L0)
空文件和(@)
符号链接。
对于符号链接:
% ll
lrwxrwxrwx 1 test test 3 Aug 8 15:51 bar -> foo
-rw-r--r-- 1 test test 0 Aug 8 15:51 baz
-rw-r--r-- 1 test test 0 Aug 8 15:52 foo
lrwxrwxrwx 1 test test 4 Aug 8 15:51 qux -> /etc/
% rm *(@)
removed 'bar'
removed 'qux'
% ll
-rw-r--r-- 1 test test 0 Aug 8 15:51 baz
-rw-r--r-- 1 test test 0 Aug 8 15:52 foo
答案4
在狂欢(以及大多数贝壳)…内置命令test
并且它的变体[
有一个选项-h
(或者-L
更容易记住)将返回成功(exit 0
) 如果文件存在并且是符号链接...因此它可以在 shell 循环中像这样使用:
for f in *
do
if [ -h "$f" ]
then
echo rm -- "$f"
fi
done
或者像这样的一行:
for f in *; do if [ -h "$f" ]; then echo rm -- "$f"; fi done
甚至更紧凑(bash 专用……尽管有报道称它可以在zsh 和 ksh以及)像这样:
for f in *; { [ -h "$f" ] && echo rm -- "$f"; }
注意:
echo
进行一次试运行...当对输出满意时,删除echo
该链接。