diff dois diretórios, mas ignore as extensões

4

Eu tenho dois diretórios com nomes de arquivos semelhantes, mas extensões diferentes. Aqui está um exemplo:

DIR1:
 - IN89284.wav
 - OUT9920.wav

DIR2:
 - IN89284.mp3
 - OUT9920.mp3

Eu quero comparar esses diretórios, mas ignorar as extensões de arquivo, então, nesse caso, eles seriam os mesmos. Como eu posso fazer isso? Eu acho que eu teria que percorrer o primeiro diretório, cortar cada nome de arquivo (cortar a extensão) e, em seguida, procurá-lo no segundo diretório. Existe alguma maneira melhor de fazer isso?

    
por user3125731 09.01.2015 / 11:11

3 respostas

2

com zsh :

diff -u <(cd dir1 && printf '%s\n' **/*(D:r)) \
        <(cd dir2 && printf '%s\n' **/*(D:r))

(D) para incluir arquivos de pontos (arquivos ocultos), :r para obter o restante (remover a extensão).

Usar a globbing garante uma ordem de classificação consistente.

(que supõe nomes de arquivos não possuem caracteres de nova linha).

    
por 09.01.2015 / 14:10
3

Você poderia usar este comando:

comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)

Isso usa find para listar todos os arquivos em cada diretório e, em seguida, basename e substituição de parâmetro para remover os nomes de diretório e as extensões de arquivo. comm compara as duas listas.

Exemplo:

$ tree
.
|-- dir1
|   |-- test1.txt
|   |-- test2.txt
|   '-- test3.txt
'-- dir2
    |-- test2.txt
    '-- test4.txt

$ comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test2
$ comm -23 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test1
test3
$ comm -13 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test4

comm -12 mostrará todos os nomes de arquivos comuns aos dois diretórios. comm -23 mostrará todos os nomes de arquivos exclusivos para dir1, comm -13 mostrará os nomes de arquivos exclusivos para dir2.

    
por 09.01.2015 / 13:11
0
diff  <(ls -1 ./dir1 | sed s/.wav//g) <( ls -1 ./dir2 | sed s/.mp3//g) 

listar o diretório e colocar cada arquivo em uma linha separada

   ls -1 

remova a extensão do arquivo

    sed s/.wav//g
    
por 30.01.2018 / 06:01