フォルダーのみを含む Linux システム上でフォルダーを再帰的に検索するにはどうすればよいですか?

フォルダーのみを含む Linux システム上でフォルダーを再帰的に検索するにはどうすればよいですか?

同じレベルに 1 つ以上のディレクトリのみを含むディレクトリを再帰的に検索するコマンドを作成しようとしています。 できれば、 というfindコマンドを使用します。 のようにfind . -type d

たとえば、次のファイル構造の場合:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

ファイル自体は含まれておらず、フォルダー(ファイルを含む)のみが含まれているため、これのみfolder2にヒットしたいと思います。folder3

答え1

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

これは、ファイルを含むフォルダーを除いた、空でないフォルダー (少なくとも 1 つ含む) のリストです。パイプやシンボリック リンクなども除外したい場合は、! -type dの代わりにを使用できます-type f。find は複雑なコンテンツ条件に一致できないため (これは XPath ではありません)、単一の find ステートメントでは実行できません。

答え2

私の理解が正しければ、これで解決するはずです:

find . -type d ! -empty -exec sh -c '\
[ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\
' sh {} \; -print

-empty、、-maxdepthおよび-mindepth-quitPOSIX に含まれていないため、このソリューションは OS では機能しない可能性があります (-print -quitは処理を高速化するためだけのものであり、このフラグメントを省略できます-maxdepth 1 -mindepth 1。ただし、 は重要です)。

秘訣は、空でないディレクトリごとに別のシェルを実行し、ディレクトリにディレクトリ以外のものが含まれていないかどうかを (非再帰的に) チェックすることです。これは で行われ-exec sh … \;、ここではテストとして機能します。ディレクトリにディレクトリ以外のものが含まれていない場合、内部の出力はfind空なので、テスト ( [ -z … ]) は終了ステータス を返し0shを返し0、は-exectrue になります。

関連情報