how do I check in bash whether a file was created more than x time ago?

LinuxBashCommand Line

Linux Problem Overview


I want to check in linux bash whether a file was created more than x time ago.

let's say the file is called text.txt and the time is 2 hours.

 if [ what? ]
 then
     echo "old enough"
 fi

Linux Solutions


Solution 1 - Linux

Only for modification time

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

You can use -cmin for change or -amin for access time. As others pointed I don’t think you can track creation time.

Solution 2 - Linux

I always liked using date -r /the/file +%s to find its age.

You can also do touch --date '2015-10-10 9:55' /tmp/file to get extremely fine-grained time on an arbitrary date/time.

Solution 3 - Linux

Using the stat to figure out the last modification date of the file, date to figure out the current time and a liberal use of bashisms, one can do the test that you want based on the file's last modification time1.

if [ "$(( $(date +"%s") - $(stat -c "%Y" "$somefile") ))" -gt "7200" ]; then
   echo "'$somefile' is older then 2 hours"
fi

While the code is a bit less readable then the find approach, I think its a better approach then running find to look at a file you already "found". Also, date manipulation is fun ;-)


  1. As Phil correctly noted creation time is not recorded, but use %Z instead of %Y below to get "change time" which may be what you want.

[Update]

For mac users, use stat -f "%m" "$somefile" instead of the Linux specific syntax above

Solution 4 - Linux

Creation time isn't stored.

What are stored are three timestamps (generally, they can be turned off on certain filesystems or by certain filesystem options):

  • Last access time
  • Last modification time
  • Last change time

a "Change" to the file is counted as permission changes, rename etc. While the modification is contents only.

Solution 5 - Linux

Although ctime isn't technically the time of creation, it quite often is.

Since ctime it isn't affected by changes to the contents of the file, it's usually only updated when the file is created. And yes - I can hear you all screaming - it's also updated if you change the access permissions or ownership... but generally that's something that's done once, usually at the same time you put the file there.

Personally I always use mtime for everything, and I imagine that is what you want. But anyway... here's a rehash of Guss's "unattractive" bash, in an easy to use function.

#!/bin/bash
function age() {
local filename=$1
local changed=#!/bin/bash
function age() {
local filename=$1
local changed=stat -c %Y "$filename"
local now=date +%s
local elapsed




let elapsed=now-changed
echo $elapsed
}




file="/"
echo The age of $file is $(age "$file") seconds.

local now=#!/bin/bash
function age() {
local filename=$1
local changed=#!/bin/bash
function age() {
local filename=$1
local changed=stat -c %Y "$filename"
local now=date +%s
local elapsed




let elapsed=now-changed
echo $elapsed
}




file="/"
echo The age of $file is $(age "$file") seconds.

local now=date +%s
local elapsed




let elapsed=now-changed
echo $elapsed
}




file="/"
echo The age of $file is $(age "$file") seconds.

local elapsed

let elapsed=now-changed echo $elapsed }

file="/" echo The age of $file is $(age "$file") seconds.

Solution 6 - Linux

The find one is good but I think you can use anotherway, especially if you need to now how many seconds is the file old

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

using GNU date

Solution 7 - Linux

Consider the outcome of the tool 'stat':

  File: `infolog.txt'
  Size: 694       	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

You can see here the three dates for Access/modify/change. There is no created date. You can only really be sure when the file contents were modified (the "modify" field) or its inode changed (the "change" field).

Examples of when both fields get updated:

"Modify" will be updated if someone concatenated extra information to the end of the file.

"Change" will be updated if someone changed permissions via chmod.

Solution 8 - Linux

I use

file_age() {
    local filename=$1
    echo $(( $(date +%s) - $(date -r $filename +%s) ))
}

is_stale() {
    local filename=$1
    local max_minutes=20
    [ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}

if is_stale /my/file; then
    ...
fi

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionflybywireView Question on Stackoverflow
Solution 1 - LinuxkmkaplanView Answer on Stackoverflow
Solution 2 - LinuxnemikView Answer on Stackoverflow
Solution 3 - LinuxGussView Answer on Stackoverflow
Solution 4 - LinuxPhilip ReynoldsView Answer on Stackoverflow
Solution 5 - LinuxMaryam JeddianView Answer on Stackoverflow
Solution 6 - LinuxVideView Answer on Stackoverflow
Solution 7 - LinuxfdrView Answer on Stackoverflow
Solution 8 - LinuxxpmatteoView Answer on Stackoverflow