Imprime a extensão do nome do arquivo usando -exec em find

3

Estou brincando com -exec flag do comando find. Eu estou tentando usar o sinalizador para imprimir o nome da extensão dos arquivos, usando uma distribuição de distribuição Linux relativamente nova.

A partir de simples, isso funciona:

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

Uma tentativa de usar o conveniente recurso de string Bash falha:

find . -type f -exec echo "${{}##*.}" \; (bad substitution)

Então, qual deve ser a maneira correta de fazer isso?

    
por Howard 13.01.2015 / 15:44

2 respostas

3

Se você quiser usar a expansão de parâmetros do shell, execute algum shell com exec :

find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
    
por 13.01.2015 / 15:54
2
 find . -type f | while read file; do echo "${file##*.}"; done

Tem a vantagem de ignorar toda essa difícil sintaxe exec que ninguém consegue lembrar.

Também tem a vantagem de criar apenas um processo filho, em vez de criar e destruir um para cada arquivo encontrado. Isso é consideravelmente mais rápido que a versão do jimmij usando exec

# Preparation - 1000 files
for i in {1..1000}; do touch $i.$i; done

>time find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
real    0m21.906s
user    0m6.013s
sys     0m12.304s


>time find . -type f | while read file; do echo "${file##*.}"; done
real    0m0.219s
user    0m0.125s
sys     0m0.087s
    
por 13.01.2015 / 15:57