Combinando basename {} e operações da string no bash

2

Eu quero escrever um script para encontrar todos os arquivos terminados em .cpp e renomeá-los como .cc . A pesquisa será feita recursivamente a partir de uma rota inicial R, que é o argumento do script.

Se nenhum argumento for escrito, R será o diretório real.

E eu escrevi:

#!/bin/bash

R=.
if [[ $# == 1 ]]
then
    echo "$# == 1"
    if [[ -d $1 ]]
    echo "$1 is directory"
    then
        R=$1
    else
        printf "Error $1 should be a directory"
        exit 1
    fi
find $R -name "*.cpp" -exec sh -c 'mv {} $(dirname {})${$(basename {})%.cpp}".cc" ' \;
exit 0
else
    printf "Invocation is: $0 directory"
    exit 1
fi

Mas sei que tenho problemas na linha de localização, porque não sei como expressar Desejo excluir a extensão e anexar a nova ao usar {}

    
por enoy 30.10.2016 / 16:56

1 resposta

5

Não faça isso operando diretamente em {} .

Você usou inline sh , então passe {} como argumento para ele, e também não precisa usar basename :

find "$R" -name "*.cpp" -type f -exec sh -c '
  for f do
    mv -- "$f" "${f%.*}.cc"
  done
' sh {} +

Note que você tem que aspas duplas $R , caso contrário, isso leva a segurança vulnerável.

    
por 30.10.2016 / 17:05