すべてのファイルを一覧表示し、サブディレクトリがないディレクトリのみを一覧表示するにはどうすればよいですか?

すべてのファイルを一覧表示し、サブディレクトリがないディレクトリのみを一覧表示するにはどうすればよいですか?

ディレクトリツリーがあり、特定の種類(allなど.jpg)のすべてのファイルを再帰的に検索したいのですが、ファイルがディレクトリツリーの一番下にある場合にのみファイルを一覧表示したいと思います。

たとえば、私のツリーが次のような場合:

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

すべてのフォルダにこのエントリがあります。 //etcのエントリだけをリストし、親フォルダのエントリは無視したいと.jpg思います。.jpgf111f222f333

find . -name "*.jpg"findコマンド(たとえば)を使用してツリー全体のすべてのアイテムのリストを取得できることを知っていますが、「結果の追加」などの操作を行わずに、一番.jpg下のフォルダにのみリストを制限する方法がわかりません。何百ものフォルダがあり、最後のレベルのフォルダがすべてのフォルダに別々の名前を持っているかどうかわからないため、実際には実現できません。grep111222333

答え1

これは2つのステップで実行できます。

find . -type d -links 2 -print0 | xargs -0 -I{} find {} -name \*.jpg

最初のコマンドは、サブディレクトリなしですべてのディレクトリを一覧表示します(各サブディレクトリはリンク数に1を追加し、空のディレクトリには2があるため)。 2番目はfind各結果を手動で呼び出します。

答え2

POSIXは次のとおりです。@TomHuntのソリューション

find . -type d -links 2 -exec sh -c '
  find "$@" -type f -name "*.jpg"' sh {} +

これは-links 2いくつかのファイルシステム属性に依存します。つまり、ディレクトリ内のリンクの数(最初は親ディレクトリのエントリとそれ自身のエントリの場合は2)が、.各サブディレクトリに対して(その中のエントリのため)1ずつ増加します。..たとえば、構造が完全に異なる一部の最新のファイルシステムには、これらのbtrfs属性nilfsがありません。

を使用すると、zsh次のことができます。

has_subdirs() {
  local l
  l=($REPLY/*(/DNoN[1]))
  (($#l))
}
dirs_without_subdirs=(**/*(DN^+has_subdirs))
jpgs=($^dirs_without_subdirs/*.jpg(ND.))
(($#jpgs)) && printf '%s\n' $jpgs

関連情報