Exemplo:
% 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"
%
O que posso fazer sobre isso? Os arquivos são idênticos.
Este não é um "diff falso positivo", mas os dois nomes de arquivo são vistos como diferentes .
Minha hipótese selvagem é que as duas pastas estão em dispositivos diferentes, com uma codificação de arquivo diferente; ou que os dois nomes são codificados de forma diferente , embora sejam visualmente idênticos. Especificamente, um dos dois "Bäkka" está na forma "pré-composta", ou seja, U+00E4 (UTF-8 C3 A4), enquanto o outro está na forma "decomposta", U+0061 U+0308 (UTF-8 0x61 0xCC 0x88) com trema de combinação.
Não tenho um MacOS em mãos, mas posso reproduzir isso em um Linux ext4:
Aparentemente, agora tenho dois arquivos com o mesmo nome na mesma pasta .
Obviamente, não posso ter certeza, mas você pode estar na mesma situação.
Para verificar, basta executar a saída de "diff"
hexdump -C
e ver se você tem algo como,Observe que no despejo hexadecimal eles são imediatamente visíveis como "Ba..kka" (o "a" é um "a" normal, seguido pelo UTF8 "adicionar um trema") e "B..kka" (há apenas um símbolo e é "pequeno latino a com trema").
Consertando coisas
Francamente, eu executaria primeiro uma normalização em toda a estrutura de pastas. Mesmo se você tiver arquivos com nomes idênticos, mas com uma codificação diferente (ou seja, alguns pré-compostos, alguns decompostos), isso vai te morder mais cedo ou mais tarde.
Do ponto de vista do sistema de arquivos, qual sistema você usa é irrelevante. O importante é como você alimenta o sistema agora e como você usa o sistema agora.
Se os novos arquivos de entrada tiverem nomes pré-compostos, faz sentido definir todos os FS como pré-compostos (ou vice-versa), para que o padrão seja mantido. Por outro lado, você também pode querer verificar funções como pesquisar arquivos, classificar e assim por diante, para verificar se os arquivos estão onde você espera que estejam (desnecessário dizer que alguns sistemas consideram "a", "ä " e "ä" o mesmo, alguns outros não - eles podem definir "a" e "ä" juntos, "ä" em outro lugar; ou vice-versa).
Eu tentaria copiar um pequeno arquivo mp3 com os nomes "älpha composto", "älpha decomposed" e "alpha neutro", depois trabalhar com uma pasta com esses três arquivos, bem como "alpha 0 test" e "alpha z test" , e então se decomposto ou pré-composto é o melhor, se houver.
Os documentos parecem indicar que você deve usar arquivos .
Então, em primeiro lugar, você precisa de uma lista de todos os nomes de arquivos. Isso é facil
Mas agora você precisa converter os elementos pré-compostos na lista para sua forma decomposta. Eu fiz um pouco de pesquisa e, para adicionar mais uma camada de complicação, parece que o MacOS e o Linux se comportam de maneira diferente , e o MacOS tem vários problemas de acomodação herdados:
Em teoria, você deve ter apenas um formulário no disco ("A camada BSD do Mac OS X usa codificação UTF-8 decomposta canonicamente para nomes de arquivos"). Na prática, parece depender (obviamente, caso contrário você não teria problemas; previsivelmente, você não está sozinho ).
Então, sou muito cauteloso em sugerir um método de conversão sem poder testá-lo de antemão em um MacOS real. Se os arquivos forem poucos, sugiro corrigi-los manualmente - exclua um arquivo e copie o outro na outra pasta.
Em teoria , você poderia fazer algo como (no Bash)
ou if ( echo "$name" | file - | grep "UTF-8" > /dev/null ); então
e se o teste corresponder, você pode fazer
e talvez o primeiro "mv" reconheça o arquivo qualquer que seja sua codificação, enquanto o segundo recrie o nome usando a codificação padrão fixa do sistema, que esperamos que seja adequada para você.
Esse tipo de operação seria muito rápido, mesmo que processasse desnecessariamente todos os nomes UTF-8.
Ignorando coisas
Você pode ignorar todos os arquivos com esse tipo de truque. Então, o problema surgiria apenas quando dois arquivos fossem diferentes e tivessem o mesmo nome codificado de forma diferente . Isso é um problema? Se não for, então está tudo pronto.
Basta fazer uma preliminar
grep
para remover as linhas contendo "^Only":Removendo duplicatas
Isso, felizmente, ignora totalmente a codificação. Existem ferramentas que já fazem isso (
jdupes
é a que eu uso). Arquivos com conteúdo idêntico que diferem por tags MP3 não funcionarão com essa abordagem e você provavelmente achará essa resposta útil.Agora, se você quiser obter duplicatas:
obterá os arquivos na pasta2 que são duplicados (-o 2.1 obterá os arquivos na pasta1).
Agora que @LSerni descobriu a questão do que está acontecendo, você ainda precisa lidar com a forma de contornar isso.
Claramente, alguma renomeação canônica ou pelo menos consistente é a melhor. Mas você pode não conseguir, ou pode acontecer com novos arquivos. Portanto, precisamos de uma solução alternativa aprimorada.
O que eu faria é evitar completamente o espinhoso problema do Unicode.
Eu executaria o diretório inteiro por meio de sha512() ou alguma outra função de hash (recursiva, se necessário). Então, eu usaria isso para reconhecer arquivos com o mesmo conteúdo, mesmo que os nomes sejam diferentes. Com efeito, criando artificialmente para fins de diff, um equivalente de nome de arquivo canônico (por meio de links simbólicos ou uma matriz programática de caminhos/hashes), ou filtrando a saída de diff, ou executando diff em várias passagens, ou substituindo sua própria lógica para relatar equivalência de arquivo incerta mas antes combinando por hash para sugerir equivalentes .....
Em outras palavras, há várias maneiras de fazer isso, e deve ser muito fácil ... mas não posso sugerir qual maneira funciona para você, pois não está claro seu objetivo preciso ao diferenciá-las, nem sua habilidade de codificação.