Mudar o nome de um conjunto de arquivos para 001, 002, ... no Linux
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?
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:
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.