特定のサブディレクトリを含まないディレクトリ名を探す

特定のサブディレクトリを含まないディレクトリ名を探す

次のようないくつかのディレクトリがあります。

Rep1/foo/bar/files

Rep2/foo/otter/files

Rep3/foo/bar/files

...

私が望むのは、サブディレクトリ* / bar /がないディレクトリの名前で、おそらく削除することもできます。どうすればいいですか?

答え1

次のスクリプトを使用できますfind

for topdir in ./*/; do
    [ -z "$(find "$topdir" -type d -name bar -print -quit)" ] &&
    echo "$topdir"
done

この部分は、単に-print -quitサブディレクトリを見つけて終了するように最適化したものです。あなたのバージョンがそれをサポートしていないbar/場合は、このセクションを削除できます。コマンドは引き続き機能しますが、少し遅くなることがあります。find-quit

または、この純粋なbashスクリプト

shopt -s globstar
for topdir in ./*/; do
    (cd "$topdir" && compgen -G '**/bar/' > /dev/null) ||
    echo "$topdir"
done

結果がうまくいったら、ディレクトリを削除echo "$topdir"に置き換えてくださいrm -r "$topdir"

どちらの方法でも任意のファイル/ディレクトリ名を処理でき、改行や特殊記号を含む名前も処理できます*

答え2

bashコマンドラインを使用して、**/filesパスに存在しないすべてのサブディレクトリを見つけます。/bar/

find . -type d -name files | grep --invert-match /bar/

以下の結果が出力されます。

./Rep2/foo/otter/files

最上位ディレクトリだけを一覧表示するには、次のようにします。

find . -type d -name files | grep --invert-match /bar/ | cut --delimiter / --fields 2

これは以下を提供します:

Rep2

答え3

この試み、

find . -mindepth 3 -maxdepth 3 ! -iname bar -type d | awk -F'/' '{print $2}'

Rep2

答え4

そしてzsh

has_bar() () (($#)) ${1-$REPLY}/*/bar(N/)

echo rm -rf rep*(/^+has_bar)

または単一のコマンドで:

echo rm -rf rep*(/^e'[() (($#)) $REPLY/*/bar(N/)]')

echo(満足すれば削除)

関連情報