Pergunta

Originalmente, eu tinha um conjunto de imagens de forma IMAGE_001.jpg, image_002.jpg, ...

Eu passei por eles e removeu vários. Agora eu gostaria de renomear os arquivos de sobra volta para IMAGE_001.jpg, image_002.jpg, ...

Existe um comando Linux que vai fazer isso perfeitamente? Estou familiarizado com renomeação, mas não pode ver nada nos nomes dos ficheiros fim como este. Estou pensando que desde listas ls *.jpg os arquivos em ordem (com lacunas), a solução seria passar a saída do que em um loop festa ou algo assim?

Foi útil?

Solução

Se entendi direito, você tem, por exemplo, IMAGE_001.jpg, image_003.jpg, image_005.jpg, e você deseja renomear a IMAGE_001.jpg, image_002.jpg, image_003.jpg.

EDIT: Este é modificado para colocar o arquivo temporário no diretório atual. Como Stephan202 observou, isso pode fazer uma diferença significativa se TEMP estiver em um sistema de arquivos diferente. Para evitar bater o arquivo temporário no circuito, ele agora passa por imagem *

i=1; temp=$(mktemp -p .); for file in image*
do
mv "$file" $temp;
mv $temp $(printf "image_%0.3d.jpg" $i)
i=$((i + 1))
done                                      

Outras dicas

Um ciclo simples (teste com echo, executar com mv):

I=1
for F in *; do
  echo "$F" `printf image_%03d.jpg $I`
  #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true
  I=$((I + 1))
done

(eu adicionei 2>/dev/null || true aos avisos suprimir cerca de arquivos de origem e de destino idênticos. Se isso não for do seu agrado, ir com Matthew Flaschen 's resposta .)

Tente o seguinte script:

numerate.sh

Este código cortou deve fazer o trabalho:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r

Este faz o inverso do que você está pedindo (tendo arquivos da forma * .jpg.001 e convertê-los para * .001.jpg), mas pode ser facilmente modificado para a sua finalidade:

for file in * 

do

if [[ "$file" =~ "(.*)\.([[:alpha:]]+)\.([[:digit:]]{3,})$" ]]

then

mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"

fi

done

algumas boas respostas aqui já; mas alguns contam com erros esconderijos que não é uma boa idéia (que assume mv só vai erro por causa de uma condição que é esperado - o que sobre tudo o erro de outros reaons mv poder).

Além disso, pode ser feito um pouco mais curto e deve ser melhor citou:

for file in *; do
    printf -vsequenceImage 'image_%03d.jpg' "$((++i))"
    [[ -e $sequenceImage ]] || \
        mv "$file" "$sequenceImage"
done

Observe também que você não deve capitalizar suas variáveis ?? em scripts bash.

Eu ia sugerir algo como o acima usando um loop for, um iterador, corte -f1 -d "_", então mv i i.iterator. Parece que ele já está coberta outras maneiras, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top