解決する

解決する

例:

% 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

これは「差分肯定性」ではありませんが、両方のファイル名は次のように処理されます。その他

私の仮説は、2つのフォルダが異なるファイルエンコーディングを使用して異なるデバイスにあること、または2つのフォルダが異なるファイルエンコーディングを使用して異なるデバイスにあることです。または2 つの名前が異なるようにエンコードされます。視覚的に同じですが。具体的には、2つの「Bäkka」のうちの1つはU + 00E4(UTF-8 C3 A4)である「事前設定された」形式であり、もう1つは「分解された」形式である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

確かに、これで、同じフォルダに同じ名前の2つのファイルがあります。

確かにわかりませんが、あなたも同じ問題に直面している可能性があります。

確認するには、「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ファイルをコピーし、これら3つのファイルと「alpha0test」と「alphaztest」を含むフォルダを使用して、分解されたファイルまたは事前設定されたファイルが最適に動作することを確認します。しました。良い(ある場合)。

文書に次のような内容が記載されているようです。分解を選択する必要があります。

まず、すべてのファイル名のリストが必要です。それは簡単です

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

ただし、リストの事前結合要素を分解形式に変換する必要があります。私はいくつかの調査を行い、より複雑になるためにMacOSとLinuxは異なる動作をします。、MacOSにはいくつかの適応問題が残っています。

重要:このQ&Aで使用されている「事前構成」および「分解」という用語は、おおよそそれぞれUnicodeパラダイムCおよびDに対応します。しかし、ほとんどのボリュームフォーマットは、これらのパラダイムの正確な仕様に従わない。たとえば、HFS Plus(Mac OS拡張)は、U + 2000からU + 2FFFに、U + F900からU + FAFFに、U + 2F800からU + 2FAFFに分解されない正規形式Dの変形を使用します(これは問題を防ぎます)。 )前のMacテキストエンコーディングからの往復変換)。あなたのボリュームフォーマットにも同様の奇妙なことがあるかもしれません。

理論的には、ディスクには1つのフォームしかありません(「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」はエンコードに関係なくファイルを識別し、2番目の「mv」は固定のデフォルトシステムエンコーディングを使用して名前を再生成します。希望あなたに合います。

これは不要な処理があっても非常に高速です。みんなUTF-8名。

仕事を無視する

あなたはできます無視するこのトリックを使用するすべてのファイル。もしそうなら、2つのファイルが異なり、エンコードが異なり、名前が同じです。。これは問題ですか?もしいいえ、これですべての準備が完了しました。

予備の手順を実行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がこの問題を発見しました。何ですか続けてください。それでも処理すべきことがあります。どのようにそれを修正してください。

明らかに、いくつかの正式または少なくとも一貫した名前の変更が最善です。しかし、そうしないかもしれませんし、新しいファイルでこれが起こるかもしれません。したがって、私たちには改善されたソリューションが必要です。

私がやりたいことは、厳しいUnicode問題を完全に避けることです。

sha512()または他のハッシュ関数(必要に応じて再帰的)を介してディレクトリ全体を実行します。次に、名前が異なる場合でも、それを使用して同じ内容のファイルを識別します。実際には、diff目的のために人工的に同等の標準ファイル名を生成する(シンボリックリンクまたはパス/ハッシュのプログラム配列を介して)diffの出力をフィルタリングする、複数のステップでdiffを実行する、または不確実なファイル同等性を報告するために独自のロジックに置き換えます。ハッシュマッチングによる事前同等性...

つまり、これを行うにはいくつかの方法があり、かなり簡単でなければなりません...しかし、これを区別する正確な目標もコーディング技術も明確ではないため、どのような方法があなたに適しているかを提案することはできません。

関連情報