Use nome do aplicativo junto com o find a>:
find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +
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.
Use nome do aplicativo junto com o find a>:
find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +
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
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.