파일 이름은 비슷하지만 확장자가 다른 두 개의 디렉터리가 있습니다. 예는 다음과 같습니다.
DIR1:
- IN89284.wav
- OUT9920.wav
DIR2:
- IN89284.mp3
- OUT9920.mp3
이 디렉터리를 비교하고 싶지만 파일 확장자를 무시하므로 이 경우에는 동일합니다. 어떻게 해야 하나요? 첫 번째 디렉터리를 반복하고 각 파일 이름을 다듬은 다음(확장자를 잘라낸 다음) 두 번째 디렉터리에서 검색해야 합니다. 더 좋은 방법이 있나요?
답변1
diff <(ls -1 ./dir1 | sed s/.wav//g) <( ls -1 ./dir2 | sed s/.mp3//g)
디렉터리를 나열하고 각 파일을 별도의 줄에 넣습니다.
ls -1
파일 확장자 제거
sed s/.wav//g
답변2
그리고 zsh
:
diff -u <(cd dir1 && printf '%s\n' **/*(D:r)) \
<(cd dir2 && printf '%s\n' **/*(D:r))
(D)
도트 파일(숨겨진 파일)을 포함하고 :r
루트 이름을 가져옵니다(확장자 제거).
와일드카드를 사용하면 일관된 정렬 순서가 보장됩니다.
(파일 이름에 개행 문자가 없다고 가정).
답변3
다음 명령을 사용할 수 있습니다.
comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
find
이는 각 디렉터리의 모든 파일을 나열한 다음 basename
매개변수 대체를 사용하여 디렉터리 이름과 파일 확장자를 제거하는 데 사용됩니다 . comm
두 목록을 비교합니다.
예:
$ tree
.
|-- dir1
| |-- test1.txt
| |-- test2.txt
| `-- test3.txt
`-- dir2
|-- test2.txt
`-- test4.txt
$ comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test2
$ comm -23 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test1
test3
$ comm -13 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test4
comm -12
두 디렉터리에 공통된 모든 파일 이름이 표시됩니다. comm -23
dir1에 특정한 파일 이름이 모두 표시되고 comm -13
dir2에 특정한 파일 이름이 표시됩니다.