0 個のファイルを含むすべてのサブディレクトリを検索

0 個のファイルを含むすべてのサブディレクトリを検索

ファイルを含まないすべてのサブディレクトリの名前を印刷します (サブディレクトリが含まれている場合があります)。現在のディレクトリに対しては、次の操作が機能します。

$ ls -p | grep -v / | wc -l | \
  xargs -I % test % -eq 0 && pwd

もっとエレガントな解決策があると思うのですが、何か提案はありますか? また、すべてのサブディレクトリを再帰的に処理するにはどのように変更すればよいでしょうか?

テスト構造は test/test1/test4 と test/test2/test3/test5 です。唯一のファイルは test/test1 にあります。基本ディレクトリ (test/) でコマンドを実行したいと思います。結果は test/ ; test/test2/ ; test/test2/test3/ のようになるはずです。これらのディレクトリにはサブディレクトリのみが含まれており、ファイルは含まれていないためです。さらに、空のエンドポイント test/test1/test4/ と test/test2/test3/test5 も許容されます。

答え1

fgrep を使用してファイルを含むディレクトリをフィルタリングします。

$ find -type d | \
  grep -xFv -f <(find -type f -printf %h\\n)

答え2

このようなもの:

find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print

これはbash -c ...、ディレクトリ内のファイルをチェックした後、0 または 1 を返す単なる「小さな」スクリプトです。

答え3

問題に対する別のアプローチ:

# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
   nofiles=true
   for f in "$d"/*; do
     [ -f "$f" ] && nofiles=false && break
   done
   [ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob

すべてのフォルダーをループし、フォルダー内のすべての項目をループしてファイルをチェックします。

最も短いスクリプトではありませんが、ファイル名に改行やスペースなどがあっても失敗しません。また、5 年後にもう一度見ても読みやすいです ;-)

関連情報