Encontre o sabado antes da data do arquivo no bash

3

Eu tenho um diretório contendo um grande número de arquivos para iterar e gostaria de uma maneira eficiente de encontrar o sábado antes da última modificação do arquivo.

Aqui estão dois exemplos. O primeiro é apenas um arquivo simples que foi editado em

$ date -r file_1
Wed Jun 21 08:26:35 CDT 2017
$ date -d "$(date -r file_1 '+%F') - $(date -r file_1 '+%u') days - 1 days"
Sat Jun 17 00:00:00 CDT 2017

Se foi modificado em um sábado, eu quero o sábado anterior.

$ date -r file_2
Sat Jun 17 00:00:00 CDT 2017
$ date -d "$(date -r file_2 '+%F') - $(date -r file_2 '+%u') days - 1 days"
Sat Jun 10 00:00:00 CDT 2017

Como você pode ver, eu tenho um método de fazer isso, mas o processo é computacionalmente muito longo. Força a data a fazer uma análise natural do inglês e, quando você faz isso centenas ou milhares de vezes, é muito lento.

    
por Pepper 25.07.2017 / 14:29

1 resposta

1

  1. Sobre o método 100 vezes mais rápido, usando stat para obter as datas, depois date -f - duas vezes para fazer as contas e formatação, com /usr/bin/* ( 4852 arquivos) como um exemplo:

    stat -c %y /usr/bin/* | date -f - "+%F - %u days - 1 days" | date -f -
    

    A saída é 4852 linhas de várias datas, todas as quais são os sábados anteriores.

  2. Mais lento: combinar os dois subshells date é executado em cerca de 33% menos tempo:

    date -r /bin/bash "+%F"  # print this only for reference
    date -d "$(date -r /bin/bash "+%F - %u days - 1 days")"
    

    Saída:

    2017-05-16
    Sat May 13 00:00:00 EDT 2017
    

Referência para ambos, (o segundo método em um loop for ):

$ time -p stat -c %y /usr/bin/* | date -f - "+%F - %u days - 1 days" | \
       date -f - > /dev/null
real 0.19
user 0.14
sys 0.19
$ time -p for f in /usr/bin/* ; do \
       date -d "$(date -r "$f" "+%F - %u days - 1 days")" ; done > /dev/null
real 27.31
user 8.11
sys 14.93
    
por agc 10.12.2017 / 11:30

Tags