Используйте предварительное имя вместе с find :
find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +
Usandofind
find assets -type d -exec sh -c '
for n in "$1"/*.png; do
test -f "$n" && mv "$n" "${n%.png}_old.png"
done' sh {} ';'
Este comando find
busca directorios en o debajo del directorio assets
. Para cada directorio encontrado, ejecuta el siguiente script de shell corto:
for n in "$1"/*.png; do
test -f "$n" && mv "$n" "${n%.png}_old.png"
done
donde $1
se expandirá a la ruta del directorio encontrado. El script iterará sobre todos los nombres de archivo que coincidan con *.png
en el directorio y reemplazará el sufijo de nombre de archivo .png
con _old.png
usando una sustitución de variable.
El test -f
se asegura de que estemos operando en archivos existentes. Esto es necesario porque si una dosis de directorio no contiene archivos que coincidan con*.png
(como en los directorios assets
, a
y a2
), entonces ese patrón permanecerá sin expandir en $n
.
Alternativamente, y más corto,
find assets -type f -name '*.png' \
-exec sh -c 'for n; do mv "$n" "${n%.png}_old.png"; done' sh {} +
Pruebas:
$ mkdir -p assets/a{,2}/b{,2,3}
$ touch assets/a{,2}/b{,2,3}/{a,b,c,d}.png
$ tree
.
`-- assets
|-- a
| |-- b
| | |-- a.png
| | |-- b.png
| | |-- c.png
| | `-- d.png
| |-- b2
| | |-- a.png
| | |-- b.png
| | |-- c.png
| | `-- d.png
| `-- b3
| |-- a.png
| |-- b.png
| |-- c.png
| `-- d.png
`-- a2
|-- b
| |-- a.png
| |-- b.png
| |-- c.png
| `-- d.png
|-- b2
| |-- a.png
| |-- b.png
| |-- c.png
| `-- d.png
`-- b3
|-- a.png
|-- b.png
|-- c.png
`-- d.png
9 directories, 24 files
(find
comando ejecutado aquí)
$ tree
.
`-- assets
|-- a
| |-- b
| | |-- a_old.png
| | |-- b_old.png
| | |-- c_old.png
| | `-- d_old.png
| |-- b2
| | |-- a_old.png
| | |-- b_old.png
| | |-- c_old.png
| | `-- d_old.png
| `-- b3
| |-- a_old.png
| |-- b_old.png
| |-- c_old.png
| `-- d_old.png
`-- a2
|-- b
| |-- a_old.png
| |-- b_old.png
| |-- c_old.png
| `-- d_old.png
|-- b2
| |-- a_old.png
| |-- b_old.png
| |-- c_old.png
| `-- d_old.png
`-- b3
|-- a_old.png
|-- b_old.png
|-- c_old.png
`-- d_old.png
9 directories, 24 files
find
Dada la estructura de directorios fija, puede usar comodines para los directorios:
rename -n s/.png/_old.png/ */*/*.png
(cambie -n
a -v
para ejecutar realmente el comando ).
Si los PNG están en diferentes niveles de directorio, aún puede evitarfind
:
shopt -s globstar
rename -n s/.png/_old.png/ **/*.png
(con globstar
establecido, **
coincide con cualquier número de niveles de directorio)
En Debian y derivados, prename
se llama rename
, pero es el mismo comando.