use basename em find -exec?

3

Se eu usar apenas o nome de base {} .txt, funcionará:

find . -iname "*.txt" -exec basename {} .txt \;

Ele apenas imprimirá xxx em vez de ./xxx.txt

se eu quiser usar $ (basename {} .txt) na opção -exec, ele falhará:

find . -iname "*.txt" -exec echo "$(basename {} .txt)" \;

Ele apenas imprimirá ./xxx.txt

Como posso resolver este problema? Espero poder usar $(basename {} .txt) como parâmetros para outro cmd. Eu tenho que fazer sh -c ou pipe -exec basename {} \; com xargs?

    
por Wang 25.12.2014 / 05:24

1 resposta

3

Tente:

find -iname "*.txt" -exec sh -c 'for f do basename -- "$f" .txt;done' sh {} +

Seu primeiro comando falhou porque $(...) é executado em subshell, que trata {} como literal. então basename {} .txt return {} , seu find se tornou:

find . -iname "*.txt" -exec echo {} \;

qual o nome do arquivo de impressão correspondente.

    
por 25.12.2014 / 05:42

Tags