ディレクトリ内のファイルを除くすべてのファイルを(安全に)削除する方法は?

ディレクトリ内のファイルを除くすべてのファイルを(安全に)削除する方法は?

環境

システム: Linuxミント19シナモン。

シェル: 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最上位ディレクトリに必要なファイルはどこにありますか?誤って他の場所で実行しないようにします。

追加ボーナスは、必要に応じてロジックを追加できることです。

おすすめ記事