Converter modificar tempo de stat em timestamp

1

Eu comecei minha jornada no bash scripting e escrevi um pequeno script que copia certos arquivos para meu pendrive e disco rígido externo como backup. Até agora ele copia o diretório inteiro com todos os arquivos, incluindo aqueles que eu não mudei, o que naturalmente leva algum tempo. Para mudar isso, quero comparar os dois arquivos (no PC e no pendrive) com relação ao momento em que foram modificados. Então agora eu me pergunto como eu posso converter a saída de

stat -c %y /test_folder/test.txt

no formato "YmDHMS"? Ou talvez alguém saiba uma maneira melhor de comparar os arquivos.

    
por Laas 12.01.2017 / 20:22

2 respostas

0

Para comparar o tempo de modificação (ou acesso ou mudança de inode) dos arquivos, você deve usar segundos desde o Epoch, é mais fácil de manipular nas comparações. A opção stat -c tem o especificador de formato %Y para obter o tempo de modificação em segundos desde a época.

Para comparar dois arquivos com base no tempo de modificação, você pode escrever uma pequena função:

chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" \
            || echo "$2 is newer" ;} 

Insira os dois arquivos de entrada como primeiro e segundo parâmetros posicionais, e a função mostrará qual deles é mais recente; quando eles tiverem exatamente os mesmos tempos de modificação, nenhuma saída será mostrada.

Exemplo:

$ chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" || echo "$2 is newer" ;}

$ chk_mod foobar spamegg 
spamegg is newer
    
por heemayl 12.01.2017 / 20:42
0

Para fins de comparação, é melhor usar segundos desde a época (ou seja, stat -a %Y ) diretamente ou até mesmo mais simples, use um dos testes de arquivo internos bash [[ FILE1 -nt FILE2 ]] or [[ FILE1 -ot FILE2 ]] :

   file1 -nt file2
          True if file1 is newer (according  to  modification  date)  than
          file2, or if file1 exists and file2 does not.
   file1 -ot file2
          True  if file1 is older than file2, or if file2 exists and file1
          does not.

No entanto, como a pergunta feita é sobre conversão, já que %y é hora de modificação, se você tiver uma versão recente do GNU date , você pode trapacear e usar isso. De man date :

-r, --reference=FILE
       display the last modification time of FILE

Então

$ date +%Y%m%d%H%M%S -r file
20170111075620

Como alternativa, você pode passar os segundos desde a época de stat para date :

$ date +%Y%m%d%H%M%S -d "@$(stat -c '%Y' file)"
20170111075620
    
por steeldriver 12.01.2017 / 20:33