Excluindo duplicatas na pasta pai OS X

0

Eu estou olhando para fazer algo que eu tenho certeza que é bastante simples - espero que com um comando de terminal semelhante a este: Como posso comparar e excluir arquivos duplicados entre várias pastas no El Capitan? .

Eu tenho mantido fotos em vários diretórios, em um dos dois formatos:

Viagens curtas:

  • /Users/Ben/Pictures/Location/pic1.jpg

Viagens longas:

  • / Usuários / Ben / Imagens / Nome da viagem / Localização1 / pic1.jpg

  • / Usuários / Ben / Imagens / Nome da viagem / Location2 / pic1.jpg

A maioria dessas pastas contém uma subpasta chamada "Melhor", na qual copiei minhas fotos favoritas da pasta pai, duplicando cada foto.

por exemplo,

Viagens curtas:

  • / Usuários / Ben / Fotos / Localização / Melhor

Viagens longas:

  • / Usuários / Ben / Imagens / Nome da viagem / Localização1 / Melhor

  • / Usuários / Ben / Imagens / Nome da viagem / Localização2 / Melhor

N.B. Alguns dos álbuns menores não contêm essa pasta "Melhor".

O que eu quero fazer é escanear recursivamente através de cada pasta procurando por uma pasta 'Melhor'. Se for encontrado, então eu quero passar por cada um dos arquivos dentro dessa pasta e excluir o item correspondente da pasta pai.

por exemplo. Pasta pai contém:

  • /Users/Ben/Pictures/Location1/pic1.jpg
  • /Users/Ben/Pictures/Location1/pic2.jpg
  • /Users/Ben/Pictures/Location1/pic3.jpg

e a pasta "Melhor" contém

  • /Users/Ben/Pictures/Location1/Best/pic1.jpg
  • /Users/Ben/Pictures/Location1/Best/pic3.jpg

Então eu quero excluir pic1 e pic3 da pasta pai e manter apenas o pic2.

Obrigado por qualquer ajuda.

    
por benje 23.06.2017 / 21:44

1 resposta

0

Agora que você esclareceu sua dúvida, eu posso ver o que você precisa: -

find /Users/Ben/Pictures/ -type d -name Best | \
     while read -r d; \
     do for f in "$d"/*; \
        do cmp "$f" "${f%/Best/*}/${f##*/Best/}" && \
           ln -sf "${f%/Best/*}/${f##*/Best/}" "$f"; \
        done; \
     done

Isso funciona da seguinte maneira: -

  • Use find para localizar todos os subdiretórios Best/ .
  • Para cada subdiretório encontrado, compare cada um dos arquivos com o original na pasta pai.
  • Se forem idênticos, sobrescreva o arquivo em Best/ com um link para o arquivo na pasta pai.
  • Se você preferir links simbólicos difíceis, poderá usar ln -f ... em vez de ln -sf ... (ambos serão adequados aos seus propósitos).
  • Os elementos de análise de chave são ${f%/Best/*} , que remove /Best/FileName do final do caminho (deve ser o mesmo que $d ) e ${f##*/Best/} , que isola o nome do arquivo do caminho (deve ser o mesmo que ${f##*/} ).
  • Normalmente, não escrevo scripts completos como respostas, mas não consigo ver uma maneira fácil de orientá-lo durante a redação; Certifique-se de entendê-lo antes de usá-lo - adicione echo na frente do comando crítico ln para ter certeza de que ele fará o que você espera.

Eu testei isso no Ubuntu, mas as implementações do OS / X de cmp e ln devem funcionar com os mesmos parâmetros.

Se você errar, faça um backup dos diretórios antes de começar.

    
por 24.06.2017 / 01:39

Tags