remoção de substring em find -exec

6

Ao usar

$ find . -name string~ -exec cp {} FOO \;

existe uma maneira de usar {} em FOO para remover o caractere til como normalmente fazemos com substrings bash

por exemplo. :

 $ echo ${string%substring}

Eu pretendo copiar os arquivos chamados string ~ para string (o oposto de $ find . -name string -exec cp {} {}~ \; ).

    
por neok 02.06.2016 / 16:12

1 resposta

7

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.

    
por 04.06.2016 / 00:07

Tags