Altera o nome de todos os arquivos PNG no diretório recursivamente [duplicado]

1

Eu tenho um diretório chamado assets e ele contém uma estrutura de arquivos semelhante a esta:

├── a
│   ├── b
│   │   ├── c.png
│   │   └── d.png
│   └── b2
│       ├── e.png
│       ├── f.png
│       └── g.png
└── a2
    └── b3
        └── h.png

Como posso alterar o nome de todas as imagens dessa estrutura para o padrão NAME_old.png , em que NAME é o nome original do arquivo? (Por exemplo, c.png seria alterado para c_old.png )

Tenho a sensação de que tem algo a ver com sed / awk / grep e usar pipes, mas não tenho a menor idéia de como usar essas ferramentas e a documentação de leitura não ajuda muito.

    
por birdoftheday 08.12.2016 / 15:21

3 respostas

3

Use nome do aplicativo junto com o find a>:

find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +
    
por 08.12.2016 / 15:32
2

Usando find

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 procura por diretórios no diretório assets . Para cada diretório encontrado, ele executa o seguinte script de shell curto:

for n in "$1"/*.png; do
    test -f "$n" && mv "$n" "${n%.png}_old.png"
done

onde $1 expandirá para o caminho para o diretório encontrado. O script iterará todos os nomes de arquivos correspondentes a *.png no diretório e substituirá o sufixo .png do nome do arquivo por _old.png usando uma substituição de variável.

O test -f garante que estamos operando em arquivos existentes. Isso é necessário porque, se uma dose de diretório não contiver arquivos correspondentes a *.png (como nos diretórios assets , a e a2 ), esse padrão permanecerá não expandido em $n .

Alternativamente, e mais curto,

find assets -type f -name '*.png' \
    -exec sh -c 'for n; do mv "$n" "${n%.png}_old.png"; done' sh {} +

Teste:

$ 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 executado aqui)

$ 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
       
por 13.02.2018 / 19:13
1

Sem find

Tendo em conta a estrutura de diretórios fixa, você pode usar curingas para diretórios:

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

(altere -n para -v para realmente executar o comando).

Se os PNGs estiverem em níveis de diretório diferentes, você ainda poderá evitar find :

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

(com globstar set, ** corresponde a qualquer número de níveis de diretório)

No Debian e derivados, prename é chamado rename , mas é o mesmo comando.

    
por 13.02.2018 / 22:45