Điều này là tốt hơn để giải quyết với globalbing hơn với 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
Bây giờ giả sử bạn không có tập tin đi lạc trong cấu trúc tốt đẹp này. Thư mục hiện tại chỉ chứa các thư mục con nghệ sĩ và những thư mục này chỉ chứa các thư mục con album. Sau đó chúng ta có thể làm một cái gì đó như thế này:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
Các <(...)
cú pháp là quá trình thay Bash: nó cho phép bạn sử dụng một lệnh ở vị trí của một đối số tập tin. Nó cho phép bạn coi đầu ra của lệnh là một tệp. Vì vậy, chúng tôi có thể chạy hai chương trình và lấy diff của chúng mà không lưu kết quả đầu ra của chúng trong các tệp tạm thời. Các diff
chương trình cho rằng nó đang làm việc với hai tập tin, nhưng trong thực tế nó đọc từ hai ống.
Lệnh sản xuất đầu vào tay quyền diff
, printf "%s\n" */*
, chỉ cần liệt kê các thư mục album. Lệnh bên trái lặp qua các *.cover
đường dẫn và in tên thư mục của chúng.
Chạy thử nghiệm:
$ 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
và foo/bar
thư mục không có cover.jpg
.
Có một số trường hợp góc bị hỏng, như thế theo mặc định *
sẽ mở rộng ra nếu nó không khớp với gì. Điều này có thể được giải quyết với Bash's set -o nullglob
.