因此,我在 Foo 目录中有一个名为 Bar 的文件夹,它是指向其他地方的另一个文件夹的软符号链接。
我在目录 Foo 中。现在我想递归删除 build 文件夹。
如果我执行 rm -rf Bar,那么符号链接会被删除,但实际内容不会被删除。如果我执行 rm -rf Bar/*,那么 Bar 的内容会从原始位置删除(这正是我想要的),但它不会听从 -f 选项。它总是在删除之前确认。有办法解决这个问题吗?
答案1
首先:了解问题:
$ rm() { /bin/rm --interactive=always "$@"; }
$ mkdir -p rmtest && touch rmtest/a rmtest/b rmtest/c rmtest/d && rm -rf rmtest
$ rm() { /bin/rm "$@" --interactive=always; }
$ mkdir -p rmtest && touch rmtest/a rmtest/b rmtest/c rmtest/d && rm -rf rmtest
/bin/rm: descend into directory 'rmtest'? y
/bin/rm: remove regular empty file 'rmtest/b'? y
/bin/rm: remove regular empty file 'rmtest/a'? y
/bin/rm: remove regular empty file 'rmtest/d'? y
/bin/rm: remove regular empty file 'rmtest/c'? y
/bin/rm: remove directory 'rmtest'? y
这个--interactive=always
(或-I
或-i
)事情至少可以使用
a) 一个函数
b) 一个普通的包装脚本
顺便说一句:不能使用别名来完成,因为--interactive
参数会放在第一位。
您必须检查每一个以摆脱这种行为,或者您可以明确调用例如/bin/rm
或/usr/bin/rm
检查是否有 shell 函数 rm
set | grep "^rm ()"
摆脱它
unset rm
或者修改它以首先具有交互参数,以便可以覆盖它
rm() { /bin/rm --interactive=always "$@"; }
查找 shell 脚本:
which rm
或者
type -p rm
然后
file $whatever_path_was_shown
例如
file /bin/rm
如果它是一个 shell 脚本
$EDITOR /bin/rm
并将--interactive
论点移到前面
如果你没有 root 权限,请使用指向原始 rm 的函数或别名隐藏 shell 脚本