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.