¿Cómo cambiar el nombre de varios archivos que incluyen subcarpetas?

¿Cómo cambiar el nombre de varios archivos que incluyen subcarpetas?

Por ejemplo tengo los siguientes archivos:

./dirA/fileA.png
./dirA/fileB.png
./dirA/fileC.png
./dirB/fileD.png
./dirB/fileE.png
./dirB/dirC/fileF.png

¿Existe algún comando o script de una línea para cambiar el nombre del archivo al siguiente?

./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB/[email protected]
./dirB/[email protected]
./dirB/dirC/[email protected]

Respuesta1

Intentar:

find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;
  • find .

    Esto inicia una búsqueda de archivos con el directorio actual.

  • -type f

    Esto limita la búsqueda a archivos normales.

  • -name '*.png'

    Esto limita la búsqueda a archivos cuyos nombres terminan en .png.

  • -execdir bash -c '...' Move {} \;

    Esto ejecuta el comando entre comillas simples con $0asignado Movey $1asignado al nombre del archivo que se encontró. En nuestro caso, el comando entre comillas simples es:

  • mv "$1" "${1%.png}@2x.png"

    Esto cambia el nombre del archivo para que termine con @2x.png. La construcción ${1%.png}elimina el .pngdel final del nombre del archivo. Por lo tanto, ${1%.png}@2x.pngreemplaza .pngal final del nombre del archivo con @2x.png.

Ejemplo

Comencemos con directorios con estos archivos:

$ find .
.
./dirA
./dirA/fileA.png
./dirA/fileC.png
./dirA/fileB.png
./dirB
./dirB/fileE.png
./dirB/dirC
./dirB/dirC/fileF.png
./dirB/fileD.png

Ahora, ejecutemos nuestro comando:

$ find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;

Una vez ejecutado el comando, ahora tenemos estos archivos:

$ find .
.
./dirA
./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB
./dirB/dirC
./dirB/dirC/[email protected]
./dirB/[email protected]
./dirB/[email protected]

información relacionada