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##*.}"' {} \;
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?
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