Substituindo carimbos de hora alterados

3

Eu preciso fazer com que os arquivos no diretório atual sejam corrigidos com um timestamp. Ele funciona bem pela primeira vez, mas depois de executá-lo novamente, ele adiciona outro registro de data e hora ao arquivo. Eu preciso de uma maneira de substituir o timestamp, não apenas adicionar a ele.

#!/bin/sh
IFS='
'

time=$(date)

for file in *
do
     mv $file "$file""$time"
done

Estou tentando pensar em como substituir os arquivos antigos, mas como o nome muda quando é alterado com o timestamp, não consigo pensar em uma maneira.

    
por user50017 27.10.2013 / 19:55

2 respostas

1

Você precisará substituir a parte atual da data no nome do arquivo e substituí-lo. Essa é uma atividade de manipulação de sequência direta para analisar a parte do nome base do nome do arquivo. Sem mais informações sobre a atual convenção de nomenclatura, uma solução não pode ser realmente fornecida além de uma abordagem geral sobre o que fazer.

Exemplo

Supondo que os arquivos tenham o nome blah _ .. date ..

for file in *
do

  basefile=${file/_*//}
  mv "$file" "$basefile""$time"
done

Isso cortará qualquer coisa depois do _ e armazenará em $basefile .

Nomes

$ echo "$file"
blah_Sun Oct 27 15:20:58 EDT 2013

$ echo ${file/_*//}
blah/
    
por 27.10.2013 / 20:27
0

Uma maneira pode ser manter os nomes dos arquivos originais em um arquivo no mesmo diretório e, em vez de ler os arquivos em um loop for, você pode usar o seguinte loop while para ler os nomes dos arquivos e adicionar a data e hora aos nomes :

while read file                                                                                                                                                                    
do                                                                                                                                                                                 
  mv $file$(date)                                                                                                                                                                  
done < "files.txt"

files.txt pode ser produzido por ls > files.txt , por exemplo, e você deve executar este comando antes de executar o script real na linha de comando ou em um script separado e apenas uma vez.

    
por 27.10.2013 / 20:27