特定のフォルダとその内容ではなく、ディレクトリ内のすべてを削除する方法

特定のフォルダとその内容ではなく、ディレクトリ内のすべてを削除する方法

私のフォルダ構造は次のとおりです。

./build
./module/build
./source

私が維持したいのは./buildとその内容だけです。

このコマンドfind . \! -path ./build -deleteは削除しませんが、./buildその内容をすべて削除します。

この状況を避ける方法は?

答え1

使用中のシェルの使用:

shopt -s extglob
rm -rfvi ./!(build)

答え2

努力する:

find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete

実行する場合:

rm -rf /tmp/tmp2
mkdir /tmp/tmp2
cd /tmp/tmp2

mkdir -p build module/build source
touch .hidden build/abc build/abc2 source/def module/build/ghi

find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete

find .

結果は次のとおりです。

./build
./build/abc

これは出力を解析するよりもはるかに安全ですls。ファイルまたはディレクトリ名にスペースが含まれているか悪い場合は、挿入された改行文字を処理する必要がありますfind

答え3

Jimmyの完璧な答えを拡張すると、次のようになります。

shopt -s extglob

拡張パターンマッチングをbashにロードしています。からman bash

If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized.  In  the  following
description, a pattern-list is a list of one or more patterns separated
by a |.  Composite patterns may be formed using  one  or  more  of  the
following sub-patterns:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns

だから:

rm -rfvi ./!(build)

この与えられたパターンを除くすべてを削除するように評価します。

答え4

find . \! -path ./build -do_somethingについては何もしませんが、./build繰り返してその下のファイルと一致します。 findにディレクトリに移動しないように指示するには、アクションを渡します-prune

find . -path ./build -prune -o . -o -delete

「フルパスが次の場合は./build巡回しないでください。そうでない場合は現在のディレクトリであれば何もしないでください。そうでない場合はファイルを削除してください。」

関連情報