Obtendo arquivos para a data atual no Linux?

4

Normalmente, o date +%d fornece a saída 08 para a data atual, 10/08/2017. Mas quando eu faço o ls -lrt em um caminho, o formato de data é como Oct 8 15:03 , então, como obtenho os arquivos da data atual?

Estou usando o comando

ls -lrt XYZ.LOG* |grep "$(date +'%b %d')" |awk '{print $9}'

mas não está me dando o arquivo da data de hoje (10/08/2017), embora me dê a saída correta para as datas de 10 a 31 de qualquer mês.

    
por User123 08.10.2017 / 15:56

5 respostas

6

Isso está enganando um pouco, mas funciona.

Primeiro, crie um arquivo de referência vazio com um timestamp específico, ou seja, meia-noite:

touch -d "$(date +%FT00:00:00)" /tmp/midnight

Em seguida, localize os arquivos mais recentes que este arquivo:

find . -type f -newer /tmp/midnight

Se você quiser a saída ls -like de find em vez de apenas os nomes de caminho:

find . -type f -newer /tmp/midnight -ls

Se você quiser encontrar arquivos que correspondam ao padrão XYZ.LOG* :

find . -type f -name 'XYZ.LOG*' -newer /tmp/midnight -ls

Se você tem o GNU find , você pode ignorar o arquivo temporário e usar

find . -type f -newermt 0

para obter arquivos modificados desde a meia-noite.

Relacionados: Por que * não * analisar 'ls'?

    
por 08.10.2017 / 16:11
2

Você pode usar stat(1) para obter o tempo de modificação de um arquivo, mas isso não é portátil.

No Linux:

$ stat -c %y some_file
2017-09-23 10:24:09.880806666 +0200

$ date -d @$(stat -c %Y some_file) +%d-%m-%Y
23-09-2017

No BSD:

$ stat -f %Sm -t %d-%m-%Y some_file
23-09-2017
    
por 08.10.2017 / 16:44
1

how to get the files of the current date?

O comando

ls tem a opção --time-style para imprimir a hora em formato específico:

ls -l --time-style=+'%d-%m-%Y' | awk -v d=$(date +%d-%m-%Y) '$6==d'

--time-style=STYLE
with -l, show times using style STYLE: full-iso, long-iso, iso, locale, or +FORMAT; FORMAT is interpreted like in 'date';

    
por 08.10.2017 / 16:26
1

Com zsh , usando qualificadores glob e age :

autoload age
print -rl ./**/XYZ.LOG*(e_'age today now'_)

ou, se você preferir o formato de listagem longo:

autoload age
ls -lrtd -- **/XYZ.LOG*(e_'age today now'_)
    
por 08.10.2017 / 17:21
0

Em geral, analisar ls output é uma má ideia. Relacionados: Por que não analisa ls ?

Um quase funciona ls answer

Uma maneira mais robusta de obter todos os arquivos de hoje com o GNU ls será:

ls -lrt --time-style=+'%Y%m%d' * | grep " $(date +'%Y%m%d') "

Isso faz com que o formato de data de cada arquivo seja um campo strongmente selecionado pelo grep com espaços de delimitação incluídos (que elimina a chance de um arquivo nomeado como uma data ser selecionado (a menos que também incluir os espaços no nome, improvável, mas ainda possível).

É claro que, se o nome do arquivo incluir espaços, a análise da saída de ls com awk {print $7} será afetada e falhará (mais campos) (tente com um arquivo criado como touch ' 20171008 test' .

Use um achado simples (GNU)

Como o que foi solicitado foi para arquivo (s) da data de hoje (um dia), podemos fazer uma seleção com -mtime (para a data de modificação) ou -atime ou -ctime para os outros dois)

$ find . -daystart -type f -mtime -1 -not -mtime -0 -print

A opção -daystart garante que o intervalo de tempo seja da meia-noite.
um -mtime -1 seleciona arquivos de um dia (e menos, por exemplo, hoje).
O -not -mtime -0 rejeita arquivos no futuro.

Não é tão simples encontrar

Quando o tempo em um intervalo (não limitado a dias inteiros) for necessário, esse encantamento pode ajudar:

find ./ -type f -newermt "$dstart" -not  -newermt "$dend" -print

em que dstart e dend contêm os limites inicial e final:

dstart=$( date -d '20171006 22:10:12' )
dend=$(   date -d '20171008 20:10:12' )
find ./ -type f -newermt "$dstart" -not  -newermt "$dend" -print
    
por 09.10.2017 / 05:55