Como remover o enésimo caractere do conjunto de nomes de arquivos?

0

Oi eu estou procurando uma solução bash para renomear arquivos em lote. Eu tenho arquivos adquiridos de uma câmera digital que estou importando como filmagem com lapso de tempo.

A cada 1000 imagens, a renomeação do arquivo JPG salta como tal:

./ P1020998.JPG
./P1020999.JPG
./P1030001.JPG
./P1030002.JPG

Estou tentando hackear um comando de shell reutilizável que me permite remover o '0' na quinta posição, de modo que a contagem de imagens seja contígua para a importação para o After Effects.

Alguém sabe a maneira mais rápida e fácil de remover o enésimo caractere em um conjunto de nomes de arquivos? Eu sempre terei a imagem definida em um diretório sem outros arquivos além da seqüência de imagens no diretório.

Eu tenho procurado e soluções até agora parece remover todos os caracteres '0' do nome do arquivo que não é o que eu quero; especificamente somente remover o quinto caractere é o resultado desejado. Obrigado por algum tempo para responder isso.

    
por RobotoHimself 23.10.2017 / 04:47

4 respostas

2

Vale a pena citar a página de manual relevante do recurso que você está usando. Na seção EXPANSION de man bash :

${parameter:offset:length}
       Substring  Expansion.  Expands to up to length characters of the value of parameter starting at the character specified by offset.  If parameter is @, an 
       indexed array subscripted by @ or *, or an associative array name, the results differ as described below.  If length is omitted, expands to the substring
       of  the value of parameter starting at the character specified by offset and extending to the end of the value.  length and offset are arithmetic expres‐
       sions (see ARITHMETIC EVALUATION below).

       If offset evaluates to a number less than zero, the value is used as an offset in characters from the end of the value of parameter.  If length evaluates
       to  a  number less than zero, it is interpreted as an offset in characters from the end of the value of parameter rather than a number of characters, and
       the expansion is the characters between offset and that result.  Note that a negative offset must be separated from the colon by at least  one  space  to 
       avoid being confused with the :- expansion.

Note que você pode realizar aritmética dentro de ${} , então você pode parametrizar seu código da seguinte forma:

#!/bin/bash
position=5

for f in *JPG; do
   mv -- "$f" "${f:0:$position-1}${f:$position}"
done

exit

Esta é uma solução rápida e suja que não verifica o tamanho dos nomes dos arquivos ou qualquer coisa, mas para um hack como este, deve ser ok.

    
por 23.10.2017 / 05:25
1

Não importa! Descobri a solução do script de shell. Para aqueles que estão aqui porque eles têm o mesmo problema aqui é o código de shell que usei:

cd DIRECTORYPATH         ## Navigate to directory with images

for f in *; do           ## Begin for loop with each file in directory
    x="{f::4}"           ## Set x as first 4 characters
    y="{f:5}"            ## Set y as all characters past position 5
    mv -- "$f" "$x$y"    ## Use mv command to rename each file as string x+y
done
    
por 23.10.2017 / 05:07
0

Outra maneira é usar sed

#!/bin/bash

cd $DIRECTORYPATH 

for f in *.JPG 
do
    mv $f $(echo $f | sed -e 's/\(^P[0-9]\{3\}\)0\([0-9]*\.JPG\)//')
done

~

    
por 23.10.2017 / 06:04
0

Use rename (renomear Perl ou prename ).

rename -nv 's/^(.{4})0/$1/' *.jpg
    
por 23.10.2017 / 06:53