Este é um caso em que você deve inserir a execução do código em um shell gerado.
find . -name '*~' -exec sh -c 'cp "$0" "${0%~}"' {} \;
Desta forma, você não precisa escrever um script. Você faz isso de uma só vez.
Observação: você não precisa do especificador --
"fim de opções" para cp
aqui, porque find
prefixará os arquivos encontrados com ./
, o que impedirá que eles sejam analisados como opções para cp
.
(A exceção a este prefixo ./
é se o diretório atual .
é ele mesmo "encontrado", mas é claro que esse nome não termina com um til, nem poderia ser confundido com um sinalizador de opção.)
Eu até usaria uma shell gerada para anexar um til ao nome da cópia; em outras palavras, eu usaria:
find . -name string -exec sh -c 'cp "$1" "$1"~' find-sh {} \;
de preferência a:
find . -name string -exec cp {} {}~ \; # Don't use this!
como este último não é especificado por POSIX e, portanto, não pode ser transportado.
Das especificações POSIX para find
:
If a utility_name or argument string contains the two characters "{}", but not just the two characters "{}", it is implementation-defined whether find replaces those two characters or uses the string without change.
... If more than one argument containing the two characters "{}" is present, the behavior is unspecified.