同じレベルに 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
は-quit
POSIX に含まれていないため、このソリューションは OS では機能しない可能性があります (-print -quit
は処理を高速化するためだけのものであり、このフラグメントを省略できます-maxdepth 1 -mindepth 1
。ただし、 は重要です)。
秘訣は、空でないディレクトリごとに別のシェルを実行し、ディレクトリにディレクトリ以外のものが含まれていないかどうかを (非再帰的に) チェックすることです。これは で行われ-exec sh … \;
、ここではテストとして機能します。ディレクトリにディレクトリ以外のものが含まれていない場合、内部の出力はfind
空なので、テスト ( [ -z … ]
) は終了ステータス を返し0
、sh
を返し0
、は-exec
true になります。