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. diff
Program 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 *.cover
yollarda 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/b
ve foo/bar
dizinleri 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
.