ディレクトリツリーがあり、特定の種類(allなど.jpg
)のすべてのファイルを再帰的に検索したいのですが、ファイルがディレクトリツリーの一番下にある場合にのみファイルを一覧表示したいと思います。
たとえば、私のツリーが次のような場合:
home
root
f1 f2 f3
f11 f22 f33
f111 f222 f333
すべてのフォルダにこのエントリがあります。 //etcのエントリだけをリストし、親フォルダのエントリは無視したいと.jpg
思います。.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