remove arquivos duplicados

6

No meu Mac OS X 10.6.7, o iTunes duplicou todos os arquivos da minha biblioteca de músicas. Agora eu tenho 3.840 arquivos em vez de 1.920. O problema é que o iTunes não simplesmente duplicou a pasta inteira, mas cada arquivo em cada pasta, adicionando um 1 à duplicata. Parece assim:

├── album1
│   ├── track1.mp3
│   ├── track1 1.mp3
│   ├── track2.mp3
│   └── track2 1.mp3
└── album2
    ├── track1.m4a
    └── track1 1.m4a

Agora, em vez de clicar em 1.920 duplicatas, quero inserir uma linha inteligente no Terminal para remover os arquivos extras:

find path/to/music/ -name "* 1.*" -delete

Embora isso funcione na maioria dos casos, isso vai atrapalhar as coisas na seguinte situação:

└── album2
    ├── track 1.mp3
    └── track 1 1.mp3

Talvez eu deva excluir "* 1 1.*" e, mais tarde, renomear esses arquivos removendo o extra 1 ?

Como faço isso?

Existe uma solução simples para isso?

    
por AvL 08.04.2013 / 16:10

2 respostas

4

Algo como isso, não testei; está no bash, então você pode ter que converter alguma sintaxe:

IFS=$'\n'              # so that only newlines separate words, not spaces
set -f                 # disable globbing
FILES=$(find path/to/music/ -name "* 1.*")

for FILE in ${FILES}; do
    if [[ -f "${FILE% 1.*}" ]] ; do
        echo "Matched ${FILE}."
        # rm "${FILE}" # Uncomment me once you have confirmed it would do what you intend.
    fi
done

${FILE% 1.*} retira a última correspondência da sintaxe 1.* do final, [[ -f ... ]] verifica se esse arquivo existe; portanto, removeria os arquivos para os quais o arquivo sem a sintaxe no final existiria. Por favor, teste antes de descomentar rm , para ter certeza de que está correto.

    
por 08.04.2013 / 16:29
5

Eu também adicionaria que para encontrar com sucesso (e remover) duplicatas de arquivos exatas , você tem que comparar arquivos por hash:

#!/bin/sh -eu
find "${1:-.}" -type f ! -empty -print0 | xargs -0 md5 -r | \
    awk '$1 in a{sub("^.{33}","");printf "%s
#!/bin/sh -eu
find "${1:-.}" -type f ! -empty -print0 | xargs -0 md5 -r | \
    awk '$1 in a{sub("^.{33}","");printf "%s%pre%",$0}a[$1]+=1{}' | \
    xargs -0 rm -v --
",$0}a[$1]+=1{}' | \ xargs -0 rm -v --

Salve isso como deldupes.sh e execute-o dando o nome do diretório como 1º parâmetro (caso contrário, $PWD será usado).

Testado no OS X, funciona para nomes longos de arquivos em branco.

    
por 11.04.2013 / 08:46