encontrar data e data de modificação mais recente e usar sed

1

Eu tenho uma série de arquivos que contêm uma data e eu preciso pegar o arquivo que tem a data mais recente, e a última modificação de data e canalizar para sed. Eu tentei várias abordagens e não consigo obter um que funcione.

por exemplo:

find . -iname '*2014-09-20*' -type f -exec ls -lrt {} \; -exec tail -1 {} \; -exec sed -n -e '/some test/,/some other text/p' {} \;

find . -iname '*2014-09-20*' -type f | xargs ls -lrt | tail -1 | sed -n -e '/some text/,/some other text/p'

os arquivos de log são parecidos com isto

-rw-r--r--. 1 root root  23042 Sep 18 14:21 logfilename_2014-09-19_20140918141909.log
-rw-r--r--. 1 root root   2343 Sep 18 14:22 logfilename_2014-09-20_20140918142142.log
-rw-r--r--. 1 root root   2343 Sep 18 14:23 logfilename_2014-09-21_20140918142245.log
-rw-r--r--. 1 root root   2343 Sep 19 10:11 logfilename_2014-09-20_20140919101031.log
-rw-r--r--. 1 root root   2343 Sep 19 10:12 logfilename_2014-09-21_20140919101122.log
-rw-r--r--. 1 root root   2343 Sep 19 10:13 logfilename_2014-09-22_20140919101218.log

Espero que a saída seja assim:

TEXT 1

line
line
line
line

TEXT 2

que funciona quando eu faço isso:

sed -n -e '/TEXT 1/,/TEXT 2/p' logfilename_2014-09-20_20140919101031.log

mas quando canalizo os resultados para sed dos cmds mencionados, não obtenho resultados. Isso é o que eu tentei até agora:

find . -iname '*2014-09-19*' -type f | xargs stat --format '%Y : %y %n' | sort -nr | cut -d: -f2- | head -1 | sed -n -e '/TEXT 1/,/TEXT 2/p'

find . -iname '*2014-09-19*' -printf "%T@\t%p\n" | sort | awk -F"\t" '{print $NF}' | tail -1 | sed -n -e '/TEXT 1/,/TEXT 2/p'
    
por Ptrkcon 19.09.2014 / 17:24

2 respostas

1

A abordagem mais simples (mas que falha se seus arquivos contiverem espaços, novas linhas ou outros caracteres estranhos) é

ls -ltr '*2014-09-20*' | tail -n 1

A maneira mais segura é

find . -printf "%T@\t%p\n" | sort | awk -F"\t" '{print $NF}'
    
por 19.09.2014 / 18:32
1

Se você precisar usar o arquivo com a hora da modificação mais recente, a abordagem mais simples é usar zsh em vez de algum outro shell e use seus qualificadores de glob om para classificar correspondências por hora de modificação e [1] para reter apenas a primeira correspondência.

echo *2014-09-20*(om[1])

Se você quiser o registro de data e hora mais recente com base na parte do registro de data e hora no nome do arquivo, a classificação normal será válida. A seguinte função atua em seu último argumento:

act_on_last_file () {
  eval 'set -- "${'"$#"'}"'
  echo "$1"
}
act_on_last_file *2014-09-20*
    
por 19.09.2014 / 23:47