노래 목록이 포함된 파일이 2개 있습니다. hdsongs.txt 및 sdsongs.txt
모든 노래를 나열하고 텍스트 파일로 출력한 다음 diff를 실행하는 간단한 스크립트를 작성했습니다. 대부분의 경우 잘 작동하지만 스크립트의 실제 diff 명령은 동일한 줄과 다른 줄을 표시합니다. 이는 실제로 여러 줄에서 발생하지만 전부는 아닙니다.
다음은 두 파일에 있는 노래의 예입니다.
$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3
뒤에 오는 특수 문자를 볼 수 없습니다.
$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$
diff를 실행하면 각 파일에 동일한 줄이 존재하지만 그 줄은 동일하지 않습니까?
$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3
이것은 여기 스레드와 유사합니다. diff는 두 파일이 동일하더라도 서로 다른 것으로 보고합니다!
그러나 이것은 전체 파일이 아닌 파일 내의 행에 대한 것이며 거기의 해상도는 이 경우에는 적합하지 않은 것 같습니다.
$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$
$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3
diff가 왜 이렇게 같은 줄을 두 번 보고하는지 아는 사람이 있나요?
답변1
내 생각 엔 파일을 전혀 정렬하지 않은 것 같습니다. 이는 정렬되지 않은 입력에서 가능한 동작 중 하나입니다.
$ cat file1
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo
그러나 정렬하면 다음과 같습니다.
$ diff <(sort file1) <(sort file2)
$
프로그램 diff
의 임무는 두 파일이 동일한지 여부와 그렇지 않은 경우 어떻게 다른지 알려주는 것입니다. 이는 서로 다른 제품 라인 간의 유사점을 찾기 위해 설계되지 않았습니다. 한 파일의 X 라인이 다른 파일의 X 라인과 다르면 파일은 동일하지 않습니다. 동일한 정보가 포함되어 있는지 여부는 중요하지 않습니다. 해당 정보가 다른 방식으로 구성되어 있으면 파일이 다르게 보고됩니다.
답변2
파일이 정렬되었다고 말하지 않았으므로 정렬되지 않았다고 가정합니다. 이는 diff
한 줄이 두 파일에 있지만 다른 위치에 나타날 때 예상되는 출력입니다. .diff
grep
답변3
인간의 눈은 컴퓨터에 표시되는 문자 간의 차이를 항상 구분할 수 없고 일부 문자가 표시되지 않을 수 있으므로 hexdiff 프로그램과 같은 프로그램을 사용해 바이너리/16진수 출력을 얻는 것이 좋습니다.