次のようないくつかのディレクトリがあります。
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
(満足すれば削除)