O Pipelined Sed não funciona no nome do arquivo encontrado dentro da substituição do comando Bash quando invocado a partir do Find “-exec”

3

Parece que 'find', 'bash' e 'sed' em alguns casos não funcionam como se espera.

O exemplo a seguir deve primeiro criar o arquivo 'sample.txt', depois encontrar o arquivo e finalmente processá-lo pelo comando '-exec'. O comando executado imprime o nome do arquivo, as amostras de teste e o nome do arquivo modificado. O comando 'sed' é usado para substituir 'txt' por 'TXT'.

touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;

A saída esperada é:

./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT

Em vez disso, produz:

./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT

(o exemplo foi testado também com a substituição do comando old-school por backquotes '' 'com o mesmo resultado)

O que estou fazendo de errado?

    
por Venca B Spam 30.10.2017 / 11:52

1 resposta

1

A substituição do comando é executada antes que find seja iniciado. O comando real executado (após substituições, expansões e remoções de cotações, etc.) é

find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;

Se você precisar executar qualquer coisa (tubos ou vários comandos) com -exec , inicie um shell separado para fazê-lo:

find . -maxdepth 1 -type f -name '*.txt' \
    -exec sh -c 'printf "%s " "$1"; printf "%s %s %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'
    
por 30.10.2017 / 12:07