해결하다

해결하다

예:

% diff "/Volumes/New Volume/4kyoutube/" "/Volumes/New Volume/tmpmusic"| grep Distortion
Only in /Volumes/New Volume/tmpmusic: ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3
Only in /Volumes/New Volume/4kyoutube/: ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3

% diff "/Volumes/New Volume/tmpmusic/ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3" "/Volumes/New Volume/4kyoutube/ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3" 
% 

어떡해? 이 파일들은 동일합니다.

답변1

이는 "차이 긍정성"이 아니지만 두 파일 이름은 다음과 같이 처리됩니다.다른.

내 가설은 두 폴더가 서로 다른 파일 인코딩을 사용하여 서로 다른 장치에 있거나 두 폴더가 서로 다른 파일 인코딩을 사용하여 서로 다른 장치에 있다는 것입니다. 또는두 이름이 다르게 인코딩됩니다.시각적으로 동일하지만. 구체적으로 두 개의 "Bäkka" 중 하나는 U+00E4(UTF-8 C3 A4)인 "사전 구성된" 형식이고, 다른 하나는 "분해된" 형식인 U+0061 U+0308(UTF- 8 0x61 0xCC) 0x88) 분음 부호와 결합됩니다.

MacOS가 없지만 ext4 Linux에서 이를 재현할 수 있습니다.

$ A=$( echo -e "Ba\xcc\x88kka" )
$ B=$( echo -e "B\xc3\xa4kka" )
$ echo $A $B
Bäkka Bäkka
$ touch $A $B
$ ls -la | grep kka
-rw-rw-rw-+  1 lserni  users     0 Apr 29 18:14 Bäkka
-rw-rw-rw-+  1 lserni  users     0 Apr 29 18:14 Bäkka

확실히,이제 같은 폴더에 같은 이름을 가진 두 개의 파일이 있습니다..

확실히는 모르겠지만, 당신도 같은 곤경에 처해 있을 수 있습니다.

확인하려면 "diff"의 출력을 실행 hexdump -C하고 다음과 같은 것이 있는지 확인하십시오.

00000020  20 20 20 30 20 41 70 72  20 32 39 20 31 38 3a 31  |   0 Apr 29 18:1|
00000030  36 20 42 61 cc 88 6b 6b  61 0a 2d 72 77 2d 72 77  |6 Ba..kka.-rw-rw|
00000060  70 72 20 32 39 20 31 38  3a 31 36 20 42 c3 a4 6b  |pr 29 18:16 B..k|
00000070  6b 61 0a                                          |ka.|

16진수 덤프에서는 즉시 "Ba..kka"("a"는 일반 "a" 다음에 UTF8 "추가 분음 부호"임) 및 "B..kka"(기호만 표시됨)로 즉시 표시됩니다. "분음 부호가 있는 작은 라틴어 a").

해결하다

솔직히 전체 폴더 구조를 표준화하는 것부터 시작합니다. 이름은 같지만 인코딩이 다른(예: 일부는 미리 조립되어 있고 일부는 분해된) 파일이 있더라도 조만간 이로 인해 문제가 발생할 수 있습니다.

파일 시스템 관점에서 볼 때 어떤 시스템을 사용하는지는 크게 중요하지 않습니다. 중요한 것은 지금 시스템에 공급하는 방법과 현재 시스템을 사용하는 방법입니다.

새로 수신되는 파일의 이름이 미리 구성된 경우 모든 FS를 미리 구성된 것으로 설정하는 것이 합리적이며 그 반대도 마찬가지이므로 표준이 유지됩니다. 반면에 파일 검색, 정렬 등의 기능을 확인하여 파일이 예상한 위치에 있는지 확인할 수도 있습니다(말할 필요도 없이,일부시스템에서는 "a", "ä" 및 "ä"를 동일한 것으로 간주하지만 일부 다른 시스템에서는 그렇지 않습니다. "a"와 "ä"가 함께 있고 "ä"가 다른 곳에 있거나 그 반대일 수 있습니다.

"älphacomposed", "älphadecomposed" 및 "alphaneutral"이라는 작은 mp3 파일을 복사한 다음 이 세 파일과 "alpha0test" 및 "alphaztest"가 포함된 폴더를 사용하여 분해된 파일 또는 사전 구성된 파일이 가장 잘 작동하는지 확인했습니다. 좋습니다(있는 경우).

문서에 다음과 같은 내용이 나와 있는 것 같습니다.분해를 선택해야 합니다..

먼저 모든 파일 이름 목록이 필요합니다. 그것은 간단합니다

find . -type f > list-as-it-is.txt

하지만 이제 목록의 미리 결합된 요소를 분해된 형식으로 변환해야 합니다. 나는 몇 가지 조사를 했고, 더 복잡해지기 위해MacOS와 Linux는 다르게 동작합니다., MacOS에는 몇 가지 적응 문제가 남아 있습니다.

중요: 이 Q&A에 사용된 "사전 구성" 및 "분해"라는 용어는 대략 각각 유니코드 패러다임 C 및 D에 해당합니다. 그러나 대부분의 볼륨 형식은 이러한 패러다임의 정확한 사양을 따르지 않습니다. 예를 들어, HFS Plus(Mac OS 확장)는 U+2000에서 U+2FFF로, U+F900에서 U+FAFF로, U+2F800에서 U+2FAFF로 분해되지 않는 정규 형식 D의 변형을 사용합니다(이렇게 하면 문제가 방지됩니다). ) 이전 Mac 텍스트 인코딩에서 왕복 변환). 귀하의 볼륨 형식에도 비슷한 이상한 점이 있을 수 있습니다.

이론적으로 디스크에는 하나의 양식만 있어야 합니다("Mac OS X의 BSD 계층은정규 분해 UTF-8 인코딩파일 이름"). 실제로는그것은 의존하는 것 같다(물론 그렇지 않으면 문제가 없을 것입니다. 예상대로,당신은 혼자가 아닙니다).

그래서 실제 MacOS에서 미리 테스트해보지 못한 채 변환 방법을 제안하는 것은 매우 조심스럽습니다. 파일 수가 적다면 수동으로 수정하는 것이 좋습니다. 한 파일을 삭제하고 다른 파일을 다른 폴더에 복사하세요.

이론적으로, 다음과 같은 작업을 수행할 수 있습니다(Bash에서).

hexa=$( echo -n "$name" | xxd -ps | tr -d "\n" )
if [ $[ 2*${#name} ] -lt ${#hexa} ]; then
    # Not ASCII.

또는 if ( echo "$name" | file - | grep "UTF-8" > /dev/null );

테스트가 일치하면 다음을 수행할 수 있습니다.

mv "$name" "$(dirname "$name")/tmpname" && mv "$(dirname "$name")/tmpname" "$name"

그리고아마도첫 번째 "mv"는 인코딩에 관계없이 파일을 식별하는 반면, 두 번째 "mv"는 고정된 기본 시스템 인코딩을 사용하여 이름을 다시 생성합니다.희망당신에게 어울릴 것입니다.

이 작업은 불필요한 처리가 있더라도 매우 빠릅니다.모두UTF-8 이름.

일을 무시하다

당신은 할 수소홀히 하다이 트릭을 사용하는 모든 파일. 그렇다면 다음과 같은 경우에만두 파일이 다르며 인코딩이 다르고 이름이 동일합니다.. 이것이 문제입니까?만약에아니요, 그러면 모든 준비가 완료되었습니다.

예비 단계를 수행 grep하고 "^Only"가 포함된 줄을 삭제하세요.

diff ... | grep -v ^Only | grep Distortion

중복 제거

다행히도 이는 인코딩을 완전히 우회합니다. 이를 수행할 수 있는 몇 가지 도구가 이미 있습니다 jdupes(제가 사용하는 도구입니다). 콘텐츠는 동일하지만 MP3 태그가 다른 파일은 이 방법으로 작동하지 않으며 다음과 같은 문제가 발생할 수 있습니다.이 답변효과가있다.

find folder1 -type f -exec md5sum \{\} \; | sort > folder1.txt
find folder2 -type f -exec md5sum \{\} \; | sort > folder2.txt

이제 복제본을 얻으려면 다음을 수행하십시오.

join -o 2.2 folder1.txt folder2.txt

폴더2에 중복 파일을 제공합니다(-o 2.1은 폴더1에 파일을 제공합니다).

답변2

이제 @LSerni가 이 문제를 발견했습니다.무엇인가요계속 가세요. 여전히 처리해야 할 일이 있습니다.어떻게그것을 고치십시오.

분명히 일부 정식 또는 적어도 일관된 이름 변경이 가장 좋습니다. 하지만 그렇게 하지 못할 수도 있고, 새 파일에서 이런 일이 발생할 수도 있습니다. 따라서 우리에게는 향상된 솔루션이 필요합니다.

내가 하고 싶은 것은 까다로운 유니코드 문제를 완전히 피하는 것입니다.

sha512() 또는 다른 해시 함수(필요한 경우 재귀적으로)를 통해 전체 디렉토리를 실행합니다. 그런 다음 이름이 다르더라도 이를 사용하여 동일한 내용을 가진 파일을 식별합니다. 실제로는 diff 목적을 위해 인위적으로 동등한 표준 파일 이름을 생성하거나(심볼릭 링크 또는 경로/해시의 프로그래밍 방식 배열을 통해) diff의 출력을 필터링하거나, 여러 단계에서 diff를 실행하거나, 불확실한 파일 동등성을 보고하기 위해 자신의 로직으로 대체합니다. 해시 매칭을 통한 사전 동등성...

즉, 이를 수행하는 방법에는 여러 가지가 있고 꽤 간단해야 합니다... 하지만 이를 차별화하려는 정확한 목표도, 코딩 기술도 명확하지 않기 때문에 어떤 방법이 귀하에게 적합한지 제안할 수 없습니다.

관련 정보