Рекурсивно изменить имя всех файлов PNG в каталоге [дубликат]

PS1='[\u@\h \W]\$ '

Выполните поиск в руководстве для PS1.

1
14.02.2018, 03:31
3 ответа

Используйте предварительное имя вместе с find :

find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +
3
27.01.2020, 23:13

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 findbusca 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 $1se expandirá a la ruta del directorio encontrado. El script iterará sobre todos los nombres de archivo que coincidan con *.pngen el directorio y reemplazará el sufijo de nombre de archivo .pngcon _old.pngusando una sustitución de variable.

El test -fse 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, ay 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

(findcomando 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
3
27.01.2020, 23:13

Sinfind

Dada la estructura de directorios fija, puede usar comodines para los directorios:

rename -n s/.png/_old.png/ */*/*.png

(cambie -na -vpara 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 globstarestablecido, **coincide con cualquier número de niveles de directorio)

En Debian y derivados, prenamese llama rename, pero es el mismo comando.

1
27.01.2020, 23:13

Теги

Похожие вопросы