bash - Encontre todos os arquivos com o mesmo nome independentemente da extensão

2

Estou fundindo duas bibliotecas de filmes e estou procurando "desduplicar" manualmente por meio de scripts bash.

Aqui está o meu processo de pensamento até agora:

  • Encontre todos os arquivos com o mesmo nome, independentemente da extensão
  • Apagar arquivo menor (tenho armazenamento por dias! e prefiro qualidade!)

Eu poderia construir sobre isso, então se eu puder de alguma forma tornar a parte de exclusão separada, eu posso construir nela. Apesar de eu poder usar o ffmpeg para inspecionar o vídeo e escolher o melhor, mas acredito que tamanho maior = melhor opção e mais simples de codificar.

Eu postei Rec Software , mas não conseguiu o que eu queria, então eu percebi bash é a minha melhor aposta, mas o meu conhecimento "encontrar" é limitado e a maioria das respostas que eu estou achando são complicadas, eu acho que isso deve ser um coisa simples.

Exemplo: Encontre arquivos com o mesmo nome, mas conteúdo diferente?

    
por FreeSoftwareServers 13.04.2018 / 05:31

2 respostas

2

Esta é uma boa maneira que escrevi para encontrar apenas os arquivos repetidos que ignoram a extensão:

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated

Depois eu coloquei esse loop para encontrar o menor dos dois arquivos para cada um:

for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done

Finalmente, mais um loop para (interativamente, com rm -i , portanto há um prompt antes de cada um), exclua todos os arquivos:

for j in $(for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done); do rm -i "$j"; done

Como isso envolve fazer dois find s no seu diretório, certamente existe uma maneira melhor. Mas isso deve funcionar para casos simples. Ele também assume que você está trabalhando a partir do diretório atual, se você quiser executar o comando em um diferente, apenas altere o argumento . para os dois comandos find .

    
por 13.04.2018 / 06:21
-1

Como acabei fazendo isso por causa do meu problema com a necessidade de excluir arquivos .srt.

Encontre arquivos com o mesmo nome, mas extensão diferente:

ls * | sed 's/.\{4\}$//' | sort | uniq -d

Nota: Isso depende da extensão ser 4 caracteres, por exemplo, .XYZ , não funcionaria para o MPEG, mas todos os meus filmes são mp4 / mkv / m4v.

Ignore os arquivos .srt:

ls * |  awk '!/.srt/'  | sed 's/.\{4\}$//' | sort | uniq -d

Eu postei um tópico separado para comparar os tamanhos dos arquivos, mas o Harrys Answer fez um ótimo trabalho, exceto que eu percebi que tinha problemas com .srt para mitigar.

Compare dois tamanhos de arquivo e exclua um arquivo menor

    
por 13.04.2018 / 07:17

Tags