Quero escrever um script para encontrar todos os arquivos que terminam com .cpp
e renomeá-los como .cc
. A busca 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 eu sei que tenho problemas na linha de busca, porque não sei como expressarQuero excluir a extensão e anexar a nova ao usar {}
Responder1
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
nada:
find "$R" -name "*.cpp" -type f -exec sh -c '
for f do
mv -- "$f" "${f%.*}.cc"
done
' sh {} +
Observe que você deve colocar aspas duplas $R
, caso contrário,isso leva à segurança vulnerável.