Bu, globbing ile çözmek için bulmaktan çok daha hoş.
$ 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
Şimdi bu güzel yapıda başıboş dosyalarınız olmadığını varsayalım. Geçerli dizin yalnızca sanatçı alt dizinlerini ve bunlar yalnızca albüm alt dizinlerini içerir. O zaman şöyle bir şey yapabiliriz:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
<(...)Sözdizimi Bash süreç ikamesi şudur: Eğer bir dosya argümanı yerine bir komut kullanmanızı sağlar. Bir komutun çıktısını bir dosya olarak görmenizi sağlar. Böylece iki programı çalıştırabilir ve çıktılarını geçici dosyalara kaydetmeden farklarını alabiliriz. diffProgram iki dosya ile çalışıyor, ama aslında iki boru okuma sanıyor.
Sağdaki girişini üreten komut diff, printf "%s\n" */*sadece albüm dizinleri listeler. Sol el komutu *.coveryollarda yinelenir ve dizin adlarını yazdırır.
Test sürüşü:
$ 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
Aha, a/bve foo/bardizinleri yok cover.jpg.
Bazı kırık köşe kasaları vardır, varsayılan olarak *eğer bir şeyle eşleşmezse kendiliğinden genişler. Bu Bash'in ile ele alınabilir set -o nullglob.