두 디렉터리를 비교하지만 확장자는 무시합니다.

두 디렉터리를 비교하지만 확장자는 무시합니다.

파일 이름은 비슷하지만 확장자가 다른 두 개의 디렉터리가 있습니다. 예는 다음과 같습니다.

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 -23dir1에 특정한 파일 이름이 모두 표시되고 comm -13dir2에 특정한 파일 이름이 표시됩니다.

관련 정보