Como usar a expansão de parâmetro com find -exec {}? [duplicado]

0

Eu quero incorporar algo como:

for f in */*; do mv "$f" "${f%/*}/foo.${f##*.}"; done  

No meu fluxo de trabalho no estilo find x -exec y {} \; .

A construção do ciclo for & A variável "$f" provavelmente será omitida; o loop será substituído pelo comportamento de iteração -exec padrão e pela variável (contendo o nome do arquivo da iteração atual), por {} .
Mas parece que essas duas sintaxes diferentes são incompatíveis / problemáticas. Especialmente por causa das chaves e ponto-e-vírgulas conflitantes, etc.

    
por tjt263 20.10.2018 / 18:50

1 resposta

1

Você pode usar -exec bash -c 'your code here using $0'

No seu caso, este

find */* -exec bash -c 'mv "$0" "${0%/*}/foo.${0##*.}"' {} \;

é o mesmo que o seu para.

for f in */*; do mv "$f" "${f%/*}/foo.${f##*.}"; done  

Dica 1: Você também pode usar -exec sh -c '.....' caso não esteja usando o bash

Dica 2: você pode combinar mais de um -exec na mesma localização:

find ./* -type f -exec echo {} \; -exec cat {} \;

Dica 3: Para construções simples, esta sintaxe é válida:

find . -type f  ! -name "*.txt" -exec mv -v '{}' '{}'.txt \;

Dica 4: Em vez de -exec , você pode usar -ok , que solicita a confirmação do usuário antes de executar o comando (útil para testes)

Acima funciona ok em GNU find (eu tenho a versão 4.6.0), mas não tenho certeza se todas essas dicas funcionam em outras find implementações.

    
por 20.10.2018 / 20:12