Automatize Renomeie arquivos de 1 para um número ilimitado

2

Como renomear vários arquivos, começando de 1 a ilimitado (para concluir todos os arquivos)?

Meus arquivos se parecem com:

file.jpeg.jpg
fileA.jpeg.jpg
fileB.jpeg.jpg

Saída:

1.jpeg.jpg
2.jpeg.jpg
3.jpeg.jpg

Estou usando o Cygwin para não poder instalar pacotes

    
por Abudayah 29.10.2015 / 08:29

4 respostas

2

Tente:

n=0; for f in *.jpg; do mv "$f" "$((++n)).jpeg.jpg"; done

Ou a mesma coisa se espalha em várias linhas:

n=0
for f in *.jpg
do
    mv "$f" "$((++n)).jpeg.jpg"
done

Como funciona

  • n=0

    Isso inicializa a variável n n.

  • for f in *.jpg; do

    Isso inicia um loop sobre todos os arquivos no diretório atual cujos nomes terminam com .jpg .

  • mv "$f" "$((++n)).jpeg.jpg"

    Isso renomeia os arquivos como você deseja. No bash, $((...)) faz aritmética. Aqui, temos que incrementar n cada vez que for executado.

  • done

    Isso sinaliza o final do loop.

Esse código funcionará mesmo se houver arquivos cujos nomes contenham espaços, tabulações, novas linhas ou outros caracteres difíceis.

O pedido

O glob test*.in é expandido em uma lista de arquivos na ordem alfabética . Isso está documentado em man bash :

bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern (see Pattern Matching below). [Emphasis added.]

Observe que o significado da classificação alfabética pode depender da sua configuração de localidade.

    
por 29.10.2015 / 08:36
1
j=0;
for i in 'ls'
do
     mv $i $j.jpeg.jpg
     j='echo $j + 1 | bc'
done
    
por 29.10.2015 / 08:40
1

Como o número de arquivos pode ser "ilimitado", há um limite interno para o tamanho da linha de comando. Consulte o link . Portanto, eu usaria find para resolver isso. Por exemplo, no bash:

cd /path/to/directory
n=1
find . -maxdepth 1 -type f -name "*.jpeg.jpg" | sort |  while read file; do
    mv "$file" $n.jpeg.jpg
    let n=n+1
done

Os passos são os seguintes, linha por linha:

  1. Altere para o diretório apropriado
  2. Defina o contador de arquivos para 1
  3. find no diretório . (atual), e não se enterre em nenhum subdiretório ( -maxdepth 1 ), e veja somente os arquivos regulares -type f , e retorne apenas arquivos cujo nome corresponda ao padrão *.jpeg.jpg , e imprimir seus nomes (por padrão). Canalize a saída do comando find para o comando sort para que eles estejam em ordem (o sort pode manipular stdin muito grande). Canalize a saída de classificação para um while / read loop, que definirá cada linha de entrada para a variável file , linha por linha.
  4. Mova o arquivo cujo nome está armazenado na variável file para um arquivo chamado pela variável $n , concatenado com a string '.jpeg.jpg'
  5. Incrementar a variável n
  6. Faça um loop para o próximo nome de arquivo.

Você pode manipular um diretório muito grande dessa maneira. É bastante imune a nomes de arquivos "estranhos" (também conhecidos como "caracteres que não estão no conjunto ASCII imprimível"). Ele pode ficar ainda mais imune, mas isso é provavelmente desnecessário para este caso, eu estou supondo (envolve o uso da opção -print0 , e provavelmente o comando xargs ).

    
por 01.11.2015 / 21:32
0

Esta versão manterá os novos arquivos na mesma ordem quando você os listar de maneira apropriada (como na saída de ls ):

#!/bin/sh
i=0
for f in *.jpeg.jpg
do
     mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
     i=$(expr $i + 1)
done
    
por 29.10.2015 / 09:25