Este é um trabalho para stat
.
Para obter o último horário de acesso em formato legível:
stat -c '%x' file.txt
em segundos desde a época:
stat -c '%X' file.txt
Eu quero extrair o dia de acesso de um arquivo em um script de shell. Eu tentei escrevendo o script a seguir, mas não funciona. Quando faço eco do dia de acesso , a saída é "staff".
file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)
Este é um trabalho para stat
.
Para obter o último horário de acesso em formato legível:
stat -c '%x' file.txt
em segundos desde a época:
stat -c '%X' file.txt
Se você observar a saída típica de ls -lu
,
-rw-r--r-- 1 someuser somegroup 74 Mar 29 05:21 filename
você notará que um total de cinco caracteres de espaço precede o nome do grupo. Sua especificação do campo 6 no comando cut
retorna o grupo ("staff" no seu caso).
Além disso, o dia de acesso seria o campo 7 e não 6 em sua anotação.
Uma solução seria usar awk
, pois ele manipula várias ocorrências do separador de campos da maneira esperada por padrão:
accessday=$(ls -lu $file | awk '{print $7}')
Com base na sua pergunta, usaria stat para normalizar a saída e, em seguida, corte para exibir apenas a data desejada.
stat -c '%x' FILENAME | cut -c 9,10
A análise da saída de ls
é difícil e nem sempre possível . Se você quiser extrair um timestamp, às vezes é um fallback necessário (é a única maneira portátil de fazer isso: nem todos os sistemas possuem um comando stat
), mas você obtém um timestamp legível que é difícil de converter em um legível por máquina . Pelo menos, tire as partes difíceis do caminho: passe as opções -o
e -g
para omitir os campos de usuário e grupo (eles podem conter espaços em alguns sistemas, impossibilitando a delimitação na saída de ls
) . Em seguida, o registro de data e hora ocupa os campos 4 a 6 (numeração de 1).
Não se esqueça de aspas duplas em torno de expansões variáveis .
access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')
Se você deseja o dia do mês, é necessário distinguir os dois formatos de saída, para carimbos de data e hora nos últimos 6 meses ou não. Defina a localidade como C para obter um formato de saída confiável. Nesse formato, o dia do mês é sempre o segundo campo de data e hora.
access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')
Tags bash ls shell shell-script timestamps