Localiza apenas arquivos nomeados exclusivos recursivamente

2

Estou com problemas para encontrar apenas arquivos nomeados exclusivos em diretórios e subdiretórios. Os arquivos devem ser exclusivos por seu nome, não por soma ou conteúdo md5.

Consegui obter uma lista de arquivos exclusivos, mas apenas nomes, não sua localização (nome do diretório) com este código. Não é possível classificar corretamente ou usar uniq se o nome da pasta estiver na string ...

find . -type f -name "*" | xargs -I% basename % | sort -u

Exemplo de resultado que recebi:

same_name
some_file
test_file

Resultado esperado:

./dir1/same_name
./dir1/some_file
./dir3/test_file

Este seria um exemplo de árvore de diretórios, mas pode ser muito maior e mais profundo

.
├── dir1
│   ├── same_name
│   └── some_file
├── dir2
│   └── same_name
├── dir3
│   └── test_file
└── same_name
    
por Matija B 29.03.2016 / 23:00

1 resposta

4

Algo como

find . -type f -printf "%f:%p\n" | awk -F: '!seen[$1]++ {print $2}'

Vamos procurar imprimir o nome de base para você e, em seguida, usar o awk para imprimir o nome do caminho apenas da primeira vez que <<> o nome da base for visto.

Eu usei dois pontos como um separador de campo e uma nova linha como o separador de registro (padrão). Ambos são caracteres de nome de arquivo válidos. Este usa o caractere nulo como o separador de registro (não é legal para nomes de arquivos) e é mais robusto

find . -type f -printf "%f
find . -type f -printf "%f:%p\n" | awk -F: '!seen[$1]++ {print $2}'
%p
find . -type f -printf "%f%pre%%p%pre%" |
  awk -v RS='%pre%' '{basename=$0; getline} !seen[basename]++'
" | awk -v RS='%pre%' '{basename=$0; getline} !seen[basename]++'
    
por 29.03.2016 / 23:24

Tags