これは、検索よりもグロブで解決する方がはるかに優れています。
$ cd ... # to the directory one level above the album/artist structure
$ echo */*/*.cover   # lists all the covers
$ printf "%s\n" */*/*.cover # lists all the covers, one per line
ここで、この素敵な構造に不要なファイルがないとします。現在のディレクトリにはアーティストのサブディレクトリのみが含まれ、アルバムのサブディレクトリのみが含まれます。その後、次のようなことができます。
$ diff  <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
<(...)構文はbashのプロセスの置換である:それはあなたがファイル引数の代わりにコマンドを使用することができます。コマンドの出力をファイルとして扱うことができます。したがって、出力を一時ファイルに保存せずに、2つのプログラムを実行し、それらの差分を取ることができます。diffプログラムは、2つのファイルで作業しているが、実際に、それは2本のパイプから読んでいると考えています。
右の手入力を生成コマンドはdiff、printf "%s\n" */*ちょうどアルバムのディレクトリを示します。左側のコマンドは、*.coverパスを反復処理し、ディレクトリ名を出力します。
テスト走行:
$ find .   # let's see what we have here
.
./a
./a/b
./foo
./foo/bar
./foo/baz
./foo/baz/cover.jpg
$ diff  <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
0a1,2
> a/b
> foo/bar
なるほど、a/bとfoo/barディレクトリは全くありませんcover.jpg。
*一致しない場合はデフォルトでそれ自体に展開するなど、いくつかの破損したケースがあります。これはBashで対処できますset -o nullglob。