Quero verificar no Linux Bash se um arquivo foi criado há mais de x tempo.
digamos que o arquivo se chama text.txt e o tempo é de 2 horas.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
flybywire
fonte
fonte
find
retornou diferente de zero quando nenhuma correspondência foi encontrada.text.txt
presume-se que não seja um diretório.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Sempre gostei de usar
date -r /the/file +%s
para descobrir sua idade.Você também pode fazer
touch --date '2015-10-10 9:55' /tmp/file
para obter um tempo extremamente refinado em uma data / hora arbitrária.fonte
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[com a suposição de que criou e nunca modificou, ou "idade em relação ao mod"]function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
é, se não obsoleto , pelo menos antigo e menos portátil , e deve-se usar em seu$(( ))
lugar; e backquotes são mais frágeis do que$( )
; e também hífens em nomes de função podem não ser totalmente portáveis. A essência disso é boa!Usando o
stat
para descobrir a data da última modificação do arquivo,date
para descobrir a hora atual e um uso liberal de bashismos, pode-se fazer o teste que você deseja com base na hora da última modificação do arquivo 1 .Embora o código seja um pouco menos legível do
find
que a abordagem, acho que é uma abordagem melhor do que executarfind
para examinar um arquivo que você já "encontrou". Além disso, a manipulação de datas é divertida ;-)%Z
invés do%Y
abaixo para obter o "tempo de mudança" que pode ser o que você deseja.[Atualizar]
Para usuários de mac, use em
stat -f "%m" $somefile
vez da sintaxe específica do Linux acimafonte
stat
não está embutido - muito ruim da minha parte, vou consertar.O tempo de criação não é armazenado.
O que são armazenados são três carimbos de data / hora (geralmente, eles podem ser desligados em certos sistemas de arquivos ou por certas opções do sistema de arquivos):
uma "alteração" no arquivo é contada como alterações de permissão, renomeação, etc. Enquanto a modificação é apenas de conteúdo.
fonte
Embora ctime não seja tecnicamente o momento da criação, frequentemente é.
Como o ctime não é afetado por alterações no conteúdo do arquivo, geralmente só é atualizado quando o arquivo é criado. E sim - posso ouvir vocês gritando - também é atualizado se você alterar as permissões de acesso ou propriedade ... mas geralmente isso é algo que é feito uma vez, geralmente ao mesmo tempo em que coloca o arquivo lá.
Pessoalmente, sempre uso o mtime para tudo e imagino que seja isso que você queira. Mas enfim ... aqui está uma nova versão da festa "nada atraente" de Guss, em uma função fácil de usar.
fonte
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…chmod
, aplicado no arquivo, vai anular essa ideia. Mas eu posso viver com você fazendo isso ;-)+%s
do segundo tempoage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(Obrigado a @Grizly pela correção!)noatime
opção (o que é bom para o desempenho, então você deve usá-lo). Portanto, basta usar em%X
vez de%Y
.Encontrar é bom, mas acho que você pode usar de outra maneira, especialmente se você precisar saber agora quantos segundos o arquivo está antigo
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
usando a data GNU
fonte
Considere o resultado da ferramenta 'stat':
Você pode ver aqui as três datas de acesso / modificação / alteração. Não há data de criação. Você só pode ter certeza de quando o conteúdo do arquivo foi modificado (o campo "modificar") ou seu inode mudou (o campo "alterar").
Exemplos de quando ambos os campos são atualizados:
"Modificar" será atualizado se alguém concatenou informações extras ao final do arquivo.
"Alterar" será atualizado se alguém alterar as permissões via chmod.
fonte
eu uso
fonte