Eu quero encontrar a idade do arquivo mais antigo em um determinado diretório ou retornar 0 se não houver nenhum arquivo nesse diretório. Eu também preciso de um comando de uma linha fazendo isso. Até agora, este é o meu comando para encontrar a idade em segundos do arquivo mais antigo no diretório:
expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
O problema é que se não houver arquivos está retornando o seguinte erro:
$ expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
stat: cannot stat ‘0’: No such file or directory
-bash: 1554373460 - : syntax error: operand expected (error token is "- ")
Portanto, neste caso, quero que o comando retorne apenas 0 e suprima a impressão do erro.
Com
zsh
eperl
:(adicione o
D
qualificador glob se você também quiser considerar arquivos ocultos (mas não.
nem..
)).Observe que, para links simbólicos, isso considera o tempo de modificação do arquivo para o qual ele resolve. Remova os
-
qualificadores nos glob para considerar o tempo de modificação do link simbólico (e use(lstat$ARGV[0] && -M _)
inperl
para obter a idade do link simbólico).Isso dá a idade em dias. Multiplique por 86400 para obter um número de segundos:
(N-Om[1])
: qualificador glob:N
: liganullglob
para esse glob. Portanto, se não houver nenhum arquivo no diretório, expande para nada, causandoperl
o-M
retorno deundef
.-
: faz com que os próximos qualificadores glob sejam aplicados no destino dos links simbólicosOm
: ordem reversa (maiúscula) por hora de modificação (portanto, do mais antigo para o mais recente, comols -rt
)[1]
: selecione apenas o primeiro arquivo correspondente-M file
: obtém a idade do conteúdo do arquivo.0+
ou86400*
forçar uma conversão para número (para oundef
caso).Se deve ser uma linha:
stat -c %Y ./* 2>/dev/null
imprima o carimbo de data/hora de todos os arquivos, ignorando erros (para que nenhum arquivo resulte em nenhuma saída)Com awk:
-v d="$(date +%s)"
salvar o timestamp atual em uma variáveld
BEGIN {m=d}
inicializarm
parad
$0 < m {m = $0}
manter o controle do mínimo emm
END {print d - m}
imprima a diferença.