Eu resolvi isso assim
#!/bin/bash
for f in {100..2} ; do mv $f $((f+1)); done
x="?_1"
y=$(echo $x | cut -b 1-1)
mv $x $y
É muito manual, mas resolve mais rapidamente o problema inicial.
tenho x número de pastas
folder1
folder2
folder3
......
folder100
O que eu quero fazer é:
add folder2
reorder
Então agora:
folder1
folder2
folder3
......
folder101
Então, agora, a pasta que era folder2 é folder3 e etc.
Exemplo: pasta2 - > pasta3, pasta3 - > folder4, folder4 - > folder5
A pasta1 permanece intacta.
Para ser mais preciso, quero automatizar isso
$ mkdir 1 2 3 4 5
$ ls
1 2 3 4 5
$ mkdir 2_1
$ ls
1 2 2_1 3 4 5
$ mv 5 6
$ ls
1 2 2_1 3 4 6
$ mv 4 5
$ mv 3 4
$ mv 2 3
$ mv 2_1 2
$ ls
1 2 3 4 5 6
$
Como faço isso no bash?
Você pode usar uma cláusula for..
com uma expressão de chave para enumeração mais aritmética inline; algo assim:
for f in {100..2} ; do mv $f $((f+1)) ; done
Isso cuidaria de mover "todas as pastas" de 100 para 2 em uma etapa.
Mais genericamente, você pode usar um script que descubra o ponto de inserção X do padrão de nome da pasta X_1 e o nome da pasta com o número mais alto antes de "fazer o furo". Algo parecido com isto:
#!/bin/bash
X=*_1
F=( $(ls * | sort -nr) )
for f in {$F..${X%_1}} ; do mv $f $((f+1)) ; done
mv $X ${X%_1}
Observe que $F
é uma matriz de todos os nomes de pastas, numericamente classificados do maior para o menor número, portanto $F
é o número mais alto. Além disso, o formato ${X%_1}
significa " $X
com o final _1
removido". O formato $((f+1))
significa "o valor de f
mais 1".
O script não processa "inserir" após o maior número.
com zsh
:
autoload zmv # best in ~/.zshrc
zmv 'folder(<2->)(#q/nOn)' 'folder$(($1 + 1))' &&
mkdir folder2
Ou para sua renomeação automática com base na presença de folder<n>_1
pastas:
setopt extendedglob
for dir ([-._[:alpha:]]##<->_1(N/nOn)) {
[[ $dir = (#b)(*)(<->)_1 ]]
zmv "($match[1])(<$match[2]->)(#q/nOn)" '$1$(($2 + 1))' &&
mv "$dir" "${dir%_1}" || break
}
Exemplo:
antes:
$ ls
bar1/ bar2/ bar2_1/ bar3/ foo1/ foo1_1/ foo1_3/ foo2/ foo3/ foo4/
depois:
$ ls
bar1/ bar2/ bar3/ bar4/ foo1/ foo2/ foo3/ foo4/ foo5/ foo6/