renomeia nomes de arquivos baseados em alguns cálculos

2

Eu tenho alguns arquivos como este:

file.i001.trusted.txt
file.i002.trusted.txt
...
...
file.i212.trusted.txt

etc.

Agora quero alterar os números de índice de i001 para i030 para A101 para A130 e i031 para i060 como A201 para A230.

Estou usando "renamex" principalmente no FreeBSD (que tem suporte a regex).

Usage: renamex [OPTIONS] filename ...
OPTIONS:
  -f, --file              Load file names from the file
  -l, --lowercase         Lowercase the file name
  -u, --uppercase         Uppercase the file name
  -s/PATTERN/STRING[/SW]  Replace the matching PATTERN with STRING.
                          The SW could be:
                          [i] ignore case when searching
                          [b] backward searching and replacing
                          [s] change file's suffix name
                          [r] PATTERN is regular expression
                          [e] PATTERN is extended regular expression
                          [g] replace all occurrences in the filename
                          [1-9] replace specified occurrences in the filename
  -R, --recursive         Operate on files and directories recursively
  -o, --owner OWNER       Change file's ownership (superuser only)
  -v, --verbose           Display verbose information
  -t, --test              Test only mode. Do not change any thing
  -h, --help              Display this help and exit
  -V, --version           Output version information and exit
  -A, --always            Always overwrite the existing files
  -N, --never             Never overwrite the existing files
Please see manpage regex(7) for the details of extended regular expression.

O que você sugere?

Editar: os intervalos podem ser diferentes. Portanto, não serão 30 itens sempre. Por exemplo A1 é 30 itens, A2 é 40 itens, A3 é 25 e assim por diante ...

    
por Plato 27.09.2017 / 12:57

1 resposta

0

com zsh :

autoload zmv # best in ~/.zshrc
zmv -n '(file.)i(<->)(.trusted.txt)' '$1A$(($2+30+70*(($2-1)/30+1)))$3'

(remova o -n ou pipe para sh quando estiver satisfeito).

Isso seria executado:

mv -- file.i001.trusted.txt file.A101.trusted.txt
mv -- file.i002.trusted.txt file.A102.trusted.txt
[...]
mv -- file.i029.trusted.txt file.A129.trusted.txt
mv -- file.i030.trusted.txt file.A130.trusted.txt
mv -- file.i031.trusted.txt file.A201.trusted.txt
mv -- file.i032.trusted.txt file.A202.trusted.txt
[...]
mv -- file.i059.trusted.txt file.A229.trusted.txt
mv -- file.i060.trusted.txt file.A230.trusted.txt
mv -- file.i061.trusted.txt file.A301.trusted.txt
mv -- file.i062.trusted.txt file.A302.trusted.txt
[...]
mv -- file.i211.trusted.txt file.A801.trusted.txt
mv -- file.i212.trusted.txt file.A802.trusted.txt

Você pode substituir <-> por <1-60> se quiser processar apenas os primeiros 60.

Se nem sempre forem lotes de 30, você sempre poderá executar vários zmvs :

i=1 j=100
for batch (30 40 30 50) {
  zmv -n "(file.)i(<$i-$((i+batch-1))>)(.trusted.txt)" \
         '$1A$(($2+j))$3'
  ((i += batch, j += 100 - batch))
}

O que dá:

mv -- file.i001.trusted.txt file.A101.trusted.txt
[...]
mv -- file.i030.trusted.txt file.A130.trusted.txt
mv -- file.i031.trusted.txt file.A201.trusted.txt
[...]
mv -- file.i070.trusted.txt file.A240.trusted.txt
mv -- file.i071.trusted.txt file.A301.trusted.txt
[...]
mv -- file.i100.trusted.txt file.A330.trusted.txt
mv -- file.i101.trusted.txt file.A401.trusted.txt
[...]
mv -- file.i150.trusted.txt file.A450.trusted.txt
    
por 27.09.2017 / 14:41

Tags