이것은 find보다 globbing으로 해결하는 것이 훨씬 좋습니다.
$ 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" */*)
<(...)
구문은 배쉬 프로세스를 대체이다 : 그것은 당신이 파일 인수 대신에 명령을 사용할 수 있습니다. 명령 출력을 파일로 취급 할 수 있습니다. 따라서 출력을 임시 파일에 저장하지 않고 두 개의 프로그램을 실행하고 diff를 수행 할 수 있습니다. 이 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
Aha, a/b
및 foo/bar
디렉토리에는 없습니다 cover.jpg
.
기본적으로 *
아무 것도 일치하지 않으면 자체로 확장 되는 것과 같이 깨진 코너 경우 가 있습니다. 이것은 Bash 's로 해결할 수 있습니다 set -o nullglob
.