Como encontrar nomes de arquivos / diretórios iguais, mas com maiúsculas / minúsculas diferentes?

7

Como posso listar os nomes de arquivos / diretórios em um diretório recursivamente que são os mesmos, mas com maiúsculas / minúsculas diferentes? ex .:

INPUT (não o comando ls , os diretórios):

[user@localhost ~/a] ls -R
.:
b

./b:
ize  Ize

./b/ize:

./b/Ize:
[user@localhost ~/a] 

OUTPUT:

/b/ize
    
por gasko peter 03.08.2013 / 14:32

3 respostas

6

Se você tem o GNU uniq , você pode classificar sem distinção entre maiúsculas e minúsculas ( -i ) e usar -d para imprimir apenas linhas duplicadas:

find . | sort -f | uniq -di

Como @StephaneChazelas mencionou em sua resposta , isso pode não fazer o que você espera se você puder ter caminhos duplicados que diferem apenas no caso (como a/b/foo e A/b/foo ).

    
por 03.08.2013 / 16:52
2

Supondo que os nomes dos arquivos não contenham caracteres de nova linha, você pode fazer algo como:

find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d

Observe que algumas implementações de tr , como o GNU tr , não alteram o caso de caracteres multibyte.

Observe também que o caminho que ele relata pode não ser o caminho de qualquer arquivo. Por exemplo, se houver um arquivo ./a/b/fOo e ./A/b/fOo , ele reportará ./a/b/foo . Se não é o que você quer, você pode querer refinar suas necessidades.

    
por 03.08.2013 / 15:48
-1

Todas essas ideias são ruins. Use somas de verificação e verifique se os arquivos são os mesmos. Então a tarefa se torna fácil.

find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'

Isto irá armazenar todos os arquivos no diretório e todos os subdiretórios e gerar todos os dupes desse arquivo, se houver algum. Eu fiz o multilinha do pipeline para facilitar a leitura.

    
por 04.08.2013 / 02:56