特定の種類のすべてのファイル (たとえば、すべての.jpg
) を再帰的に検索するディレクトリ ツリーがありますが、これらのファイルがディレクトリ ツリーの一番下にある場合にのみ、それらのファイルをリストしたいとします。
たとえば、私のツリーが次のようになっているとします。
home
root
f1 f2 f3
f11 f22 f33
f111 f222 f333
すべてのフォルダーに 's が含まれている場合、 / /などの 's.jpg
のみをリストし、上位のフォルダーにある 's は無視します。.jpg
f111
f222
f333
ツリー全体のfind . -name "*.jpg"
すべての の一覧を取得するためにfind コマンド ( など) を使用できることはわかっていますが、結果を ' して/ /をフィルターするなどの操作を行わずに、最下位のフォルダーのみに制限する方法がわかりません。これは、フォルダーが何百もあり、最終レベルのフォルダーが個別にどのような名前になっているかわからないため、実際には実現可能ではありません。.jpg
grep
111
222
333
答え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