Removendo os pontos principais da saída do comando find quando usado com a opção -exec echo {}

0
find . -type f -exec  echo {} \;

Usando o comando acima, desejo obter nomes de arquivos sem os caracteres "./". Então, basicamente, eu quero começar:

filename

Em vez de:

./filename

Qualquer maneira de fazer isso?

    
por Diplomat 20.12.2016 / 17:51

3 respostas

1

find . -type f -exec echo {} \;

A ação padrão de find é imprimir os resultados. Quando não explicitamente informado, find é padronizado para pesquisar no diretório atual. Seu comando pode ser simplificado para find -type f .

Por que / quando isso importa? Somente quando você executar este comando em um diretório suficientemente grande, você começará a ver a diferença de desempenho. -exec echo {} \; fará seu computador funcionar desnecessariamente mais porque ele precisa iniciar um processo externo como /bin/echo para imprimir os nomes dos arquivos. Uma instância do echo executable é executada por arquivo encontrado por find .

Para responder à sua pergunta sobre como remover ./ , um método mais eficiente seria usar cut . Você sabe que os dois primeiros caracteres são sempre ./ . cut -c3- só reterá os caracteres da posição 3 e além.

> cd /etc/fonts/conf.d
> find -type f | cut -c3-
99pdftoopvp.conf
00kde.conf
65-khmer.conf
README

Isso não funciona como esperado se os nomes dos seus arquivos contiverem um novo caractere de linha, mas essa é outra história totalmente nova.

    
por 20.12.2016 / 18:59
2

Supondo que você não queira o nome do arquivo sozinho, mas também o caminho relativo completo sem o primeiro ./ , se você tiver o GNU find , você pode tentar isto:

find . -type f -printf '%P\n'

Senão, você pode tentar um destes:

find . -type f -print | cut -d/ -f2-

find .[^.]* * -type f -print

Você deve evitar este último (pense na linha de comando excessivamente longa se tiver muitas entradas em seu diretório).

-print faz a mesma coisa que seu -exec echo {} \; , mas é muito melhor: nenhuma chamada de processo externo reduz a sobrecarga e nenhum efeito colateral indesejável com nomes de arquivos que começam com um traço.

    
por 20.12.2016 / 18:39
1

A versão GNU do find fornece o formato built-in-printf que permite formatar a saída da sua consulta.

Então, para responder sua pergunta

find . -type f -printf '%f\n'

Produzirá apenas os nomes de arquivos sem caracteres iniciais (ou nomes de caminho) com uma nova linha, de forma que cada nome de arquivo esteja em sua própria linha

    
por 20.12.2016 / 20:11

Tags