【问题标题】:Removing directory recursively without using rm command不使用 rm 命令递归删除目录
【发布时间】:2012-09-19 19:45:10
【问题描述】:

您好,我正在尝试递归删除/删除一个目录及其子目录和文件。我不想使用 rm -r。我想出了以下代码。

 function recursive(){
            for i in "$1"/*; do

                    if [ -d $i ];then
                            echo "FILE $i IS A DIRECTORY"
                            if [ "$(ls -A $i)" ];then
                                    echo "DIRECTORY IS NOT EMPTY CALLING RECURSIVE AGAIN"
                                    recursive $i
                            else
                                    echo "DELETE THIS DIRECTORY: ITS EMPTY"
                            fi
                    elif [ -e $i ];then
                            echo "DELETING FILE $i"
                    else
                            echo UNKNOWN FILE $(basename $i)
                    fi
            done

    }

问题是当我深入挖掘子目录时,我可以在途中删除它们的文件,但是一旦我到达目录树的底部,我必须删除所有现在为空的目录(也许在我回来的路上起来?)

如果有人能帮助我理解其逻辑或引导我走向正确的方向,我将不胜感激。

THIS 问题的答案是有道理的,但我不知道如果子目录级别很少怎么处理?

【问题讨论】:

  • 一旦你到达目录树的底部,你最深的 recursive() 就完成了它的 for 循环。然后它跳到下一个更高的,完成recursive $i。在recursive $i 调用之后目录应该是空的,所以也许然后删除目录。
  • “我想打螺丝,但我不想用螺丝刀。” 为什么你不想使用rm -r?如果不出意外,这个问题的答案可以帮助我们更好地了解您的要求。
  • 我认为他这样做是出于教育目的。
  • 我现在想通了...嗯,基本上我想添加回收站功能,这意味着实际上我不会删除,而是将其移动到垃圾箱...但只是为了简化我是这样写的。
  • @CQQL:这当然是合理的,但不如 OP 的实际声明有用。

标签: bash shell unix recursion


【解决方案1】:

删除目录的内容后,无论如何都可以删除它。所以只需删除 else 语句并将 remove-directory-command 上移一级:

function recursive(){
        for i in "$1"/*; do

                if [ -d $i ];then
                        echo "FILE $i IS A DIRECTORY OR A (SYM)LINK TO ONE"
                        if [ "$(ls -A $i)" ];then
                                echo "DIRECTORY IS NOT EMPTY CALLING RECURSIVE AGAIN"
                                recursive $i
                        fi

                        echo "DELETE THIS DIRECTORY: ITS (NOW) EMPTY"
                elif [ -e $i ];then
                        echo "DELETING FILE $i"
                else
                        echo UNKNOWN FILE $(basename $i)
                fi
        done

}

【讨论】:

  • 我认为这是有道理的......我现在已经把我的头绕过去了......会试一试并很快发布完整的答案
  • 危险:当有符号链接指向已删除树之外时,这可能会导致非常糟糕的意外情况
【解决方案2】:

我会简单地使用

find "$1" -delete

unlink 可能也是一个不错的想法,但我不确定你是否会考虑作弊:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 2010-10-06
    • 2020-07-09
    • 2018-10-15
    • 2013-07-04
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多