Adicione uma pasta em uma seqüência de pastas e renomeie as outras pastas

0

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?

    
por henryubuntu 20.09.2017 / 02:39

3 respostas

-1

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.

    
por 24.09.2017 / 07:31
2

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.

    
por 20.09.2017 / 05:04
0

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/  
    
por 24.09.2017 / 07:39