É mais fácil com zsh
:
autoload zmv # best in ~/.zshrc
cd "Folder 1"
n=0; zmv -n '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
(remova -n
(para dry-run) quando feliz).
-
<->
: qualquer sequência de dígitos decimais ( <x-y>
sem limite)
-
(#qn)
: para classificação numérica (então Subfolder 10
vem depois Subfolder 2
).
-
^/
: exclui arquivos do tipo diretório .
-
${(l:2::0:)var}
: left-pad (e truncar se for maior) $var
com 0
s para length 2.
Uma nota de aviso: enquanto o **/
glob se destina a corresponder a qualquer nível de subdiretório, incluindo o nível vazio, para corresponder arquivos no diretório atual, em zmv
isso não acontece por causa da passagem dupla faz com o padrão, uma vez para glob e a segunda vez como correspondência de padrão simples para extrair os grupos de captura (e, em seguida, esse segundo **/Item
quando o padrão coincide com a falta do /
).
Um trabalho é usar:
zmv -n '(**/)Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
ou:
zmv -wn '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
mas zmv
detecta que é uma correspondência recursiva e ativa a ordem de profundidade (para poder renomear diretórios com segurança). Se você não quiser a ordem de primeira ordem e corresponder arquivos no diretório atual, poderá usar o formato longo de **/
( (*/)#
):
zmv -n '(*/)#Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
Exemplo
Em:
.
├── Subfolder 1
│ ├── Item.01
│ ├── Item.02
│ └── Subsubfolder
│ └── Item.01
├── Subfolder 10
│ ├── Item.01
│ └── Item.02
└── Subfolder 2
├── Item.01
└── Item.02
Dá:
mv -- Subfolder\ 1/Item.01 Item\ 01
mv -- Subfolder\ 1/Item.02 Item\ 02
mv -- Subfolder\ 1/Subsubfolder/Item.01 Item\ 03
mv -- Subfolder\ 2/Item.01 Item\ 04
mv -- Subfolder\ 2/Item.02 Item\ 05
mv -- Subfolder\ 10/Item.01 Item\ 06
mv -- Subfolder\ 10/Item.02 Item\ 07