如何(安全地)删除目录中除文件之外的所有目录?

如何(安全地)删除目录中除文件之外的所有目录?

环境

系统:Linux Mint 19 Cinnamon。

Shell:Bash 版本 4.4.19(1)。


问题

除了数百个测试场景之外,我一定还创建了无数个暂时的以文件为内容的安装目录,我每次都需要手动删除。它看起来像这样:

$ ls --group-directories-first --classify

test1/  test2/  testA/  testFin/  decrypt-file-aes256*  encrypt-file-aes256*  Makefile  openssl-encryption.tar.xz  openssl-encryption.tar.xz.asc  SHA512SUM

我想自动化这个清理过程。


进步

我发现该find命令非常有用,例如:

find . -maxdepth 1 -type d -exec rm -rf {} +

在我从终端进行的早期测试中,这表明是有效的,但在我将其放入我的 Makefile、干净目标中之前,我想问是否有我应该考虑的安全措施?


然而,该示例产生了一个小错误:

rm: refusing to remove '.' or '..' directory: skipping '.'

如何在这里变得更具体?


当前重构的“干净”Makefile 目标

clean:

    @echo; tput bold; tput setaf 3; echo Target: $@; tput sgr0; echo

    @if [ $$(id --user) -eq 0 ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run as normal user!"; tput sgr0; echo; exit 1; \
    fi

    @if [ ! -f .safeclean-$(distrib_name) ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run from within its Makefile's directory!"; tput sgr0; echo; exit 1; \
    fi

    @ls -l | grep '^d' > /dev/null || echo "There are no more directories."

    @for dir in *; do \
        if [ -d "$$dir" ]; then rm --force --recursive --verbose "$$dir"; fi \
    done

    @rm --force --verbose $(distrib_name).tar.xz $(distrib_name).tar.xz.asc

    @echo; tput bold; tput setaf 2; echo "Ok. Directory clean successful."; tput sgr0

示例输出(视觉)

示例输出(视觉)

答案1

首先,在 Makefile 中执行find+操作之前请格外小心。rm

话虽如此,您可能会发现编写脚本更容易:

myclean:
        test -f .safefile && \
        for fn in * ; do \
                test -d "$$fn" && rm -rf "$$fn" ; \
        done

.safefile其中应该存在于您的顶级目录中的文件在哪里。它将确保您不会错误地从不同的位置运行它。

额外的好处是您还可以在需要时向其中添加逻辑。

相关内容