使用glob来解决比使用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
现在,假设您在这个漂亮的结构中没有杂散文件。当前目录仅包含艺术家子目录,而仅包含唱片集子目录。然后我们可以做这样的事情:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
该<(...)
语法是bash进程替换:它可以让你在一个地方文件参数的使用的命令。它使您可以将命令的输出视为文件。因此,我们可以运行两个程序并比较它们,而不必将它们的输出保存在临时文件中。该diff
程序认为它正在处理两个文件,但实际上它是从两个管道读取的。
产生到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
。