Combinando las operaciones de nombre base {} y cadena en bash

Combinando las operaciones de nombre base {} y cadena en bash

Quiero escribir un script para encontrar todos los archivos que terminan en .cppy cambiarles el nombre como .cc. La búsqueda se realizará de forma recursiva desde una ruta inicial R, que es el argumento del script.

Si no se escribe ningún argumento, R será el directorio real.

Y he escrito:

#!/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

Pero sé que tengo problemas en la línea de búsqueda porque no sé cómo expresarQuiero eliminar la extensión y agregar la nueva cuando uso {}

Respuesta1

No hagas tal cosa operando directamente en {}.

Ha usado inline sh, así que páselo {}como argumento y tampoco necesita usarlo basenameen absoluto:

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

Tenga en cuenta que debe poner comillas dobles $R; de lo contrario,conduce a una seguridad vulnerable.

información relacionada