Renomear arquivos numericamente (ordem de data / hora) [duplicado]

3

Eu tenho 200 arquivos em uma pasta. Eu baixei-os em uma certa ordem - muitas vezes com apenas alguns segundos de intervalo. Gostaria de acrescentar um número ao início de cada um dos arquivos.

Portanto, o primeiro arquivo que baixei (o mais antigo) precisaria ser alterado de name.txt para 001_name.txt .

Até o último arquivo (baixado mais recentemente) que muda de name.txt para 200_name.txt .

Como posso fazer isso usando a linha de comando?

    
por Kian 25.09.2013 / 15:35

2 respostas

8

O seguinte irá quebrar em arquivos contendo novas linhas, mas deve funcionar o resto do tempo. Ele classificará os arquivos com base na hora da última modificação, e não no tempo real de criação, porque o Ubuntu não armazena o tempo de criação dos arquivos. Então, se você modificou os arquivos desde que os baixou, não obterá uma ordem precisa.

n=0; ls -tr | while read i; do n=$((n+1)); mv -- "$i" "$(printf '%03d' "$n")"_"$i"; done

ls -tr ordena arquivos por hora de modificação, o mais antigo primeiro (e quando você canaliza a saída de ls ele lista automaticamente os arquivos um por linha, em vez do modo padrão de fazer as coisas - deve ser notado que é um GNU-ism, se você tiver que trabalhar em outro * nix com uma versão diferente de ls , isso pode não ser o caso. while read i pega essa lista e passa por cima de cada item, um de cada vez, e o resto faz a renomeação real.

n=$((n+1)) incrementa a variável $n em um. Poderia haver problemas se isso tivesse sido definido de antemão, então, para estar no lado seguro, você deve defini-lo como 0 no início da linha.

$(printf '%03d' "$n") imprime o número contido na variável $ n, preenchido com três zeros (portanto, 001, 002 ... 087 ... 999). Espero que o comando mv seja bastante óbvio.

    
por evilsoup 25.09.2013 / 16:23
2

O script a seguir fará o trabalho:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: 'basename $0' DIRECTORY"
  exit 1
fi

count=1
ls -tr $@ | while read file; do
    if [ $count -lt 10 ]; then
        mv -v $file '00'$count'_'$file
    elif [ $count -lt 100 ]; then
        mv -v $file '0'$count'_'$file
    else
        mv -v $file '0'$count'_'$file
    fi
    count=$(($count+1))
done

Isso eu apenas testei e funcionou para mim.

    
por Radu Rădeanu 25.09.2013 / 16:37