Ini jauh lebih baik untuk diselesaikan dengan globbing daripada dengan find.
$ 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
Sekarang anggaplah Anda tidak memiliki file liar dalam struktur yang bagus ini. Direktori saat ini hanya berisi subdirektori artis, dan direktori tersebut hanya berisi subdirektori album. Maka kita dapat melakukan sesuatu seperti ini:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
The <(...)
sintaks proses substitusi Bash: itu memungkinkan Anda menggunakan perintah di tempat argumen berkas. Ini memungkinkan Anda memperlakukan output dari suatu perintah sebagai file. Jadi kita bisa menjalankan dua program, dan mengambil diff mereka, tanpa menyimpan output mereka dalam file sementara. The diff
Program berpikir itu bekerja dengan dua file, tapi sebenarnya itu membaca dari dua pipa.
Perintah yang menghasilkan masukan tangan kanan untuk diff
, printf "%s\n" */*
, hanya berisi daftar direktori album. Perintah tangan kiri beralih melalui *.cover
jalur dan mencetak nama direktori mereka.
Uji coba:
$ 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
dan foo/bar
direktori tidak punya cover.jpg
.
Ada beberapa kasus sudut yang rusak, seperti itu secara default *
mengembang sendiri jika tidak cocok. Ini bisa diatasi dengan Bash set -o nullglob
.