
ファイルを含まないすべてのサブディレクトリの名前を印刷します (サブディレクトリが含まれている場合があります)。現在のディレクトリに対しては、次の操作が機能します。
$ 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 年後にもう一度見ても読みやすいです ;-)