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

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

特定の種類のすべてのファイル (たとえば、すべての.jpg) を再帰的に検索するディレクトリ ツリーがありますが、これらのファイルがディレクトリ ツリーの一番下にある場合にのみ、それらのファイルをリストしたいとします。

たとえば、私のツリーが次のようになっているとします。

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

すべてのフォルダーに 's が含まれている場合、 / /などの 's.jpgのみをリストし、上位のフォルダーにある 's は無視します。.jpgf111f222f333

ツリー全体のfind . -name "*.jpg"すべての の一覧を取得するためにfind コマンド ( など) を使用できることはわかっていますが、結果を ' して/ /をフィルターするなどの操作を行わずに、最下位のフォルダーのみに制限する方法がわかりません。これは、フォルダーが何百もあり、最終レベルのフォルダーが個別にどのような名前になっているかわからないため、実際には実現可能ではありません。.jpggrep111222333

答え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 つずつ増加する (サブディレクトリ内のエントリのため) という一部のファイル システムの特性に依存しています。ただし、構造が根本的に異なるや などの..一部の最新のファイル システムには、このような特性がありません。btrfsnilfs

を使用すると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

関連情報