Renomeia múltiplos números de seqüência de decréscimo de diretórios?

3

Eu tenho um diretório que contém vários subdiretórios com nomes no formato dir.## . O prefixo é sempre o mesmo e o sufixo é de 1 a 3 dígitos em uma sequência estritamente incremental. Assim, algo semelhante a:

dir.0
dir.1
dir.2
dir.3
...
dir.9
dir.10
dir.11
...
dir.298
dir.299
dir.300

Primeiro, quero excluir os primeiros diretórios desse tipo. Isso é trivial.

Em seguida, desejo renomear todos os diretórios subseqüentes para alterar os sufixos numéricos de forma que, por exemplo, dir.7 se torna dir.0 , dir.8 se torna dir.1 , dir.10 se torna dir.3 , etc. Ou seja, desloque cada sufixo (tratado como um número) por um determinado deslocamento constante.

Como faço para executar essa operação de renomeação sem renomear cada diretório separadamente e manualmente?

Estou bem com o uso de uma ferramenta separada para isso, mas seria bom se eu pudesse fazer tudo em bash sem software "exótico".

    
por a CVn 03.12.2012 / 22:48

3 respostas

6

Esse decremento pode ser feito de uma maneira bem baixa: gere a lista, comece no começo. Não é assim tão fácil “produzir” lidando com todos os casos, mas é pouco mais que um one-liner se você estiver disposto a codificar coisas como o número máximo de dígitos e assumir que não existem outros arquivos chamados dir.* . Usando a sintaxe bash, ajustada para menos digitação:

i=0
for x in dir.{?,??,???}; do
  mv "$x" "${x%.*}.$i"
  ((++i))
done

Note que tem que ser dir.{?,??,???} e não dir.* para obter dir.9 antes de dir.10 .

Em zsh, você pode tornar isso um pouco mais robusto, sem custos, usando <-> para expandir para qualquer sequência de dígitos e (n) para classificar numericamente ( dir.9 antes de dir.10 ).

i=0
for x in dir.<->(n); do
  mv $x ${x%.*}.$i
  ((++i))
done
    
por 03.12.2012 / 22:58
1

Outra abordagem:

n=7   # number to delete
max=$(printf "%s\n" dir.* | grep -o '[[:digit:]]*' | sort -n | tail -1)
for (( i=0; i<n; i++)); do rm -r "dir.$i"; done
for (( i=n; i<=max; i++ )); do mv "dir.$i" "dir.$((i-n))"; done
    
por 03.12.2012 / 23:24
0

Você também pode usar a ferramenta gráfica KRename.

Aqui estão os passos:

  1. escolher arquivos
  2. escolha a opção para renomear arquivos
  3. ativar o plug-in JavaScript \
  4. set campo Prefixo para esvaziar, Sufixo: vazio, Nome do arquivo: use nome original, extensão: outra extensão: [js;krename_extension-OFFSET] onde OFFSET é o valor que você precisa diminuir.
por 03.12.2012 / 23:09

Tags