Recursivamente compare contagens de arquivos específicos entre dois diretórios

3

Eu pesquisei e pesquisei, mas não encontrei uma resposta para essa pergunta.

Aqui está o cenário: Acabei de copiar toda a minha coleção de CDs para liberar o codec de áudio sem perdas (FLAC) para arquivamento. Eu também tenho alguns lossy .m4a OU .mp3 de alta qualidade neste arquivo. Isso é armazenado na estrutura DIRECTORY01 / artist-album / * .flac. Todos os arquivos relevantes neste diretório são .flac, .m4a ou .mp3

Em seguida, transcodifiquei todo esse diretório para ogg vorbis, para uso diário real e para meu media player portátil. Isso é armazenado na estrutura DIRECTORY02 / artist-album / * .ogg. Todos os arquivos relevantes são .ogg.

Agora quero verificar se tudo está bem. Eu usei o diff para comparar o número de pastas (e verificar se elas são as mesmas. Então eu contei o número de arquivos flac e ogg (respectivamente) em cada um.

Problema: existem três arquivos .ogg extras na pasta .ogg, de alguma forma, em algum lugar. Como cada diretório pai contém 526 subpastas, gostaria de saber como identificar automaticamente os diretórios que diferem apenas na contagem de arquivos de tipos de arquivo .ogg ou .flac / .m4a / .mp3 específicos (ignorando qualquer .txt, .log,. nfo, .cue, .jpg, etc).

Então, idealmente, seja qual for o comando executado, o resultado seria um relatório que ignora subdiretórios comuns com contagens de arquivos comuns e ajuda a identificar especificamente quaisquer diretórios que tenham diferentes ".ogg ou .flac / .m4a /. mp3 "contagens de arquivos.

Isso é possível? Eu também estou aberto a outras sugestões / lógicas para verificar se todo o número X de .flac / .m4a / .mp3 foi transcodificado com sucesso para .ogg.

    
por ethan 03.04.2017 / 17:11

3 respostas

2

Usando um loop for com find , isso pode não ser o caminho mais rápido para atingir sua meta, mas deve funcionar corretamente:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Ou mais legível

for dir in DIRECTORY01/*/ ; do
  fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c)
  ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c)
  if [[ "$fcount" -ne "$ocount" ]]; then
    echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files"
  fi
done

Produzirá algo semelhante a:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Para cada diretório em que as contagens de arquivos não coincidem. O loop não irá lidar normalmente com as condições de erro como um diretório 'Artist - Album' aparecendo em DIRECTORY01, mas não em DIRECTORY02, ou diferenças na ortografia do diretório 'Album - Artist'.

    
por Arronical 03.04.2017 / 17:51
3

Como você tem mais .ogg do que .flac , uma abordagem simples seria encontrar todos os nomes *.ogg e verificar quais não têm o nome .flac correspondente. Algo como:

find DIRECTORY02/ -type f -name '*ogg' -print0 | 
    while IFS= read -r -d '' f; do 
        flac="${f//.ogg/.flac}"; 
        flac="${flac##DIRECTORY02/}"; 
        [[ -e DIRECTORY01/"$flac" ]] || 
            printf "Missing file: %s\n" "$flac"; 
done

Aqui está a mesma coisa que um script comentado:

#!/bin/bash

## find all files in DIRECTORY02/ whose name ends in .ogg
find DIRECTORY02/ -type f -name '*.ogg' -print0 | 
    ## Iterate over the results of the find command, saving
    ## each file as "$f". The fancy -print0 and read -d '' stuff
    ## is needed to deal with filenames that can contain newlines.
    while IFS= read -r -d '' f; do 
        ## create the new $flac variable which is $f but with ".flac"
        ## instead of ".ogg"
        flac="${f//.ogg/.flac}"; 
        ## remove the "DIRECTORY02/" from the $flac variable. If
        ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg'
        ## it is now 'artist - album/file.flac'.
        flac="${flac##DIRECTORY02/}"; 
        ## Check whether the file exists in the same subdirectory under
        ## DIRECTORY01
        [[ -e DIRECTORY01/"$flac" ]] || 
            ## If it doesn't, print
            printf "Missing file: %s\n" "$flac"; 
done
    
por terdon 03.04.2017 / 17:57
0

Você pode tentar usar meld . A descrição é:

O Meld é um visualizador gráfico de diferenças e uma aplicação de mesclagem para o GNOME Área de Trabalho. Suporta diffs de 2 e 3 arquivos, diffs de diretórios recursivos, diff de diretórios sob controle de versão (Bazaar, Codeville, CVS, Darcs, SCM Fossil, Git, Mercurial, Monotone, Subversion), bem como a capacidade de mesclar manualmente e automaticamente as diferenças de arquivo.

1) O site é:

link

2) E se estiver na sua lista de repositórios, você pode instalá-lo com:

sudo apt-get update
sudo apt-get install meld

3) Também está no aplicativo do Ubuntu Software.

    
por heynnema 03.04.2017 / 18:53