Como mostrar diretórios distintos no find?

3

Eu quero encontrar todos os diretórios contendo, por exemplo, arquivos com o nome * .txt. mas a saída não deve conter duplicatas. Como fazer isso?

    
por Nips 21.11.2014 / 21:59

5 respostas

3

Tente:

find . -type f -name "*.txt" -printf '%h\n' | sort | uniq

Isso funciona da seguinte maneira:

find . -type f -name "*.txt" -printf '%h\n' - encontre todos os arquivos que terminam em *.txt e imprima seu diretório ( %h ) seguido por uma nova linha.

| sort - classifica os diretórios

| uniq - remover duplicatas

    
por 21.11.2014 / 22:09
2

código compatível com POSIX que deve funcionar para qualquer nome do arquivo

find . -name '*.txt' -printf '%h
find . -name '*.txt' -printf '%h%pre%' | tr '%pre%\n' '\n%pre%' | sort -u | tr '%pre%\n' '\n%pre%'
' | tr '%pre%\n' '\n%pre%' | sort -u | tr '%pre%\n' '\n%pre%'
    
por 21.11.2014 / 22:13
2

Um problema pode ser que os nomes dos diretórios podem conter novas linhas, portanto, a saída da localização deve ser terminada pela NUL. Para ter um canal de saída legível, o resultado da classificação em tr :

find . -name "*.txt" -printf '%h
find . -name "*.txt" -printf '%h%pre%' | sort -zu | tr '%pre%' '\n'
' | sort -zu | tr '%pre%' '\n'

Qualquer nova linha em um nome de diretório provavelmente pode ser determinada olhando para a próxima linha, se começar com ./ , não é uma nova linha em um diretório.

    
por 21.11.2014 / 22:17
1

Com o GNU find e o bash

find . -type d -exec bash -c \
$'for f; do find \"$f\" -maxdepth 1 -type f  -name \'*.txt\' -printf \'%h\n\' -quit; done'\
_ {} +
    
por 22.11.2014 / 02:59
0

Isso deve funcionar para você:

find . -iname "*.txt" -exec dirname {} \; | sort | uniq

O find + exec obterá os nomes dos diretórios de todos os arquivos * .txt, sort|uniq obterá os diretórios exclusivos.

    
por 21.11.2014 / 22:08

Tags