Copiando e renomeando pastas incrementalmente

2

Eu tenho uma pasta chamada P1. Como posso fazer 59 cópias dessa pasta, mas nomeando-as de forma incremental, ou seja, as novas pastas são nomeadas como P2, P3, ..., P60?

Veja o que eu fiz, mas não funcionou:
Eu fiz 59 cópias manualmente e tentei renomeá-las usando:

j=2;for f in /path/to/folders/*; do mv "$f" "$j"; let j=j+1; done

mas todos os meus arquivos copiados, incluindo o arquivo original, foram excluídos do diretório.

O que havia de errado com o comando que escrevi e como posso copiar e renomear tudo automaticamente?

    
por Mahin Ra 14.10.2016 / 16:59

1 resposta

3

Em seu comando, os diretórios são renomeados primeiro para o valor de var j , que é 2 , então você acaba com apenas uma cópia chamada 2 (conforme cada substitui a anterior). Depois que o processo for concluído, j será reatribuído para j+1 ( echo $j retornos 3 ) - ele não será incrementado.

Para fazer 59 cópias, você pode fazer isso:

for i in {2..60}; do cp -r -- P1 P"$i"; done

{2..60} se expande para 2 3 4 5 6 7 até 60

Para números de largura fixa (então, 02 vem antes de 11 na classificação) use printf :

for i in {2..60}; do cp -r -- P1 P$(printf %02d "$i"); done

Isso fornece P02 P03 P04 ... P10 , P11

Para renomeação incremental você pode fazer algo assim, assumindo que as cópias não são numeradas ...

j=0; for dir in /path/to/stuff/*; do mv -v -- "$dir" "$dir""$((++j))"; done

Formato de largura fixa:

j=0; for dir in /path/to/stuff/*; do printf -v new "$dir%02d" "$((++j))"; mv -v -- "$dir" "$new"; done

Talvez valha a pena tornar esse último mais legível ...

j=0
for dir in /where/my/stuff/is/*
  do printf -v new "$dir%02d" "$((++j))"
  mv -v -- "$dir" "$new"
done
    
por Zanna 14.10.2016 / 17:14