Renomeando arquivos com data e data para o dia anterior

4

Eu quero renomear os arquivos em um diretório para números sequenciais, com base nesta regra:
nome do arquivo- [alguma data] = > nome do arquivo- [data do dia anterior]

Por exemplo, file20170329 file20170328 e file20170327 devem ser renomeados para file20170328 file20170327 e file20170326 .

Eu tenho 100 arquivos, então eu preciso de um truque melhor do que renomear cada arquivo individualmente.

    
por storm 29.03.2017 / 12:55

3 respostas

4

O seguinte script:

  • para cada arquivo
  • Se o nome do arquivo for maior que 8 (isto é, é possível manter uma data)
  • basefilename mantém o nome do arquivo sem os últimos 8 caracteres
  • HOJE - mantém os últimos 8 caracteres (a data)
  • YESTERDAY - tem um dia antes de $ TODAY como 8 caracteres
  • Em vez de usar mv , criei uma pasta /tmp/storage e o script copiará os arquivos para esse local. Dessa forma, a renomeação de um arquivo não corromperá outro arquivo se, por acaso, o nome da base dos dois arquivos for o mesmo, mas a data será diferente em um dia

Observação: para permitir que o script execute o cp , você deve remover o echo da linha echo cp ...

mkdir -p /tmp/storage
for f in *
do
  if [ "${#f}" -gt 8 ]; then
    filebasename=${f::-8}
    TODAY=${f: -8}
    YESTERDAY='date '+%C%y%m%d' -d "$TODAY-1 days"'
    echo cp $f /tmp/storage/${f//$TODAY}$YESTERDAY; 
  fi
done

exemplo:

$ ls *20*
aaa2hhh20170329  aaahhh20170329  xajds20170222  xajsxs20170224
Resultado do script

:

cp aaa2hhh20170329 /tmp/storage/aaa2hhh20170328
cp aaahhh20170329 /tmp/storage/aaahhh20170328
cp xajds20170222 /tmp/storage/xajds20170221
cp xajsxs20170224 /tmp/storage/xajsxs20170223
    
por Yaron 29.03.2017 / 13:08
4

Se você tem 100 arquivos (e tem acesso a perl rename , geralmente o caso no Ubuntu) você pode usar:

for n in {100..1}; do rename -n "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

Agora, quando você usa -n para testes, ele reclama assim:

rename(file20170217, file20170216)
file20170218 not renamed: file20170217 already exists
file20170219 not renamed: file20170218 already exists

Mas quando você o executa sem -n , o arquivo não existe mais, então a renomeação é bem sucedida:

for n in {100..1}; do rename "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

Se você tiver mais de 100 arquivos, será necessário aumentar o intervalo para {150..1} ou o que for.

Isso é muito lento. Levará talvez 2 minutos ou mais para renomear 100 arquivos. Mas funciona.

    
por Zanna 29.03.2017 / 13:36
0

ou se você preferir a abordagem GUI, experimente o krename, ele tem vários módulos e você pode escrever scripts customizados nele, "função do sistema de data", "plugin de data e hora" pode funcionar para você

link

sudo apt-get install krename
    
por Sumeet Deshmukh 29.03.2017 / 19:12