AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 899774
Accepted
ethan
ethan
Asked: 2017-04-04 07:11:10 +0800 CST2017-04-04 07:11:10 +0800 CST 2017-04-04 07:11:10 +0800 CST

Compare recursivamente as contagens de arquivos específicos entre dois diretórios

  • 772

Eu procurei e procurei, mas não encontrei uma resposta para esta pergunta.

Aqui está o cenário: acabei de copiar toda a minha coleção de CDs para o codec de áudio sem perdas (FLAC) gratuito para arquivo. Também tenho alguns arquivos .m4a OU .mp3 com perda de alta qualidade neste arquivo. Isso é armazenado na estrutura DIRECTORY01/artista - álbum/*.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 reprodutor de mídia portátil. Isso é armazenado na estrutura DIRECTORY02/artista - álbum/*.ogg. Todos os arquivos relevantes são .ogg.

Agora quero verificar se está tudo bem. Usei o diff para comparar o número de pastas (e verificar se são iguais. Depois contei o número de arquivos flac e ogg (respectivamente) em cada um.

Problema: há 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 arquivo .txt, .log, . nfo, .cue, .jpg, etc).

Portanto, idealmente, quaisquer que sejam os comandos executados, o resultado seria um relatório que ignora subdiretórios comuns com contagens de arquivos comuns e me ajuda a identificar especificamente quaisquer diretórios que tenham arquivos ".ogg ou .flac/.m4a/.mp3" diferentes conta.

Isso é possível? Também estou aberto a outras sugestões/lógicas para verificar se todos os números X de .flac/.m4a/.mp3 foram transcodificados com sucesso para .ogg.

directory
  • 3 3 respostas
  • 374 Views

3 respostas

  • Voted
  1. terdon
    2017-04-04T07:57:58+08:002017-04-04T07:57:58+08:00

    Como você tem mais .oggde .flac, uma abordagem simples seria encontrar todos os *.oggnomes e verificar quais não têm um .flacnome 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
    
    • 3
  2. Best Answer
    Arronical
    2017-04-04T07:51:35+08:002017-04-04T07:51:35+08:00

    Usando um forloop com find, esta pode não ser a maneira mais rápida de atingir seu objetivo, 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
    

    Irá produzir algo semelhante a:

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

    Para cada diretório onde as contagens de arquivo não correspondem. O loop não lidará normalmente com condições de erro, como um diretório 'Artista - Álbum' aparecendo em DIRECTORY01, mas não em DIRECTORY02, ou diferenças na ortografia do diretório 'Álbum - Artista'.

    • 2
  3. heynnema
    2017-04-04T08:53:05+08:002017-04-04T08:53:05+08:00

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

    Meld é um visualizador gráfico de diferenças e aplicativo de mesclagem para a área de trabalho do GNOME. Ele suporta diferenças de 2 e 3 arquivos, diferenças de diretório recursivas, diferenças de diretórios sob controle de versão (Bazaar, Codeville, CVS, Darcs, Fossil SCM, Git, Mercurial, Monotone, Subversion), bem como a capacidade de mesclar manualmente e automaticamente diferenças de arquivo.

    1) O site é:

    http://meldmerge.org/

    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 Ubuntu Software.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve