Obter todos os arquivos contém valor de data menor que uma data de entrada

1

Eu tenho milhares de arquivos .txt em uma pasta:

A saída ls da pasta é semelhante a:

2-20160329050200862185.instan-methodstack_2016-03-06-23.55.05.436-+0000_2016-09-07-05.31.47.105-+0000.txt
2-20160329050200862185.instan-methodstack_2016-03-06-23.55.05.436-+0000_2016-09-07-05.27.47.000-+0000.txt
2-20160329050200862185.instan-methodstack_2016-03-06-23.55.05.436-+0000_2016-09-07-05.25.46.891-+0000.txt
2-20160329050200862185.instan-methodstack_2016-03-06-23.55.05.436-+0000_2016-09-07-05.23.46.788-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.07.21.784-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.05.22.541-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.02.41.320-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-06.22.49.534-+0000_2016-07-27-07.01.32.824-+0000.txt

Agora, quero listar todos os arquivos que têm um valor de data inferior a uma data de entrada

Por exemplo:

Minha data de entrada é: 2016-08-11

Eu quero o resultado:

2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.07.21.784-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.05.22.541-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-07.02.41.320-+0000_2016-07-27-07.02.41.320-+0000.txt
2-20160329050200862185.instan-methodstack_2016-04-27-06.22.49.534-+0000_2016-07-27-07.01.32.824-+0000.txt

O valor da data de comparação deve ser verificado após a cadeia começar com +0000 _

Eu tentei vários comandos, mas nada funcionou.

ls | awk ' { i = substr($0, 73, 10); cond = "2015-09-07"; if expr "$i" "<" "$cond" > /dev/null; then print($0); fi }'
ls | awk ' { i = substr($0, 73, 10); if ( (date -d i +"%Y%m%d") -lt 20160907 ) print($0) endif; print("\n") }'

Por favor ajude.

    
por fortune 17.02.2017 / 08:04

3 respostas

2

Assumindo analisando ls não é propenso a erros neste caso:

ls | awk '{ i = substr($0, 73, 10); if(i < "2016-08-11") print }'

ou o equivalente

ls | awk '{ i = substr($0, 73, 10) } i < "2016-08-11" '
  • i = substr($0, 73, 10) salva a data extraída na variável i
  • i < "2016-08-11" se esta condição for verdadeira, imprimir linha de entrada

Como a data está no formato YYYY-MM-DD , uma comparação simples de string funcionará sem a necessidade de qualquer conversão

    
por 17.02.2017 / 11:10
0

você pode tentar este comando

você pode fornecer a entrada de data como formato yyymmdd no comando awk

ls *.txt > all_files.txt
awk -F_ -vin_date="20160427" '{split($2,a,"-");date=a[1]a[2]a[3];if(date+0<in_date)print}' all_files.txt
    
por 17.02.2017 / 08:17
0

Combinando match e substr em awk , dando-me o resultado desejado:

ls | awk 'match($0,"\+0000_"){i = substr($0,RSTART+6,10)} i < "2016-08-11" '
    
por 20.02.2017 / 08:03