Determining age of a file in shell script

后端 未结 6 1092
暖寄归人
暖寄归人 2021-01-04 18:28

G\'day,

I need to see if a specific file is more than 58 minutes old from a sh shell script. I\'m talking straight vanilla Solaris shell with some POSIX extensions i

相关标签:
6条回答
  • 2021-01-04 18:34

    A piece of the puzzle might be using stat. You can pass -r or -s to get a parseable representation of all file metadata.

    find . -print -exec stat -r '{}' \;
    

    AFAICR, the 10th column will show the mtime.

    0 讨论(0)
  • 2021-01-04 18:35

    You can use ls and awk to get what you need as well. Awk has a c-ish printf that will allow you to format the columns any way you want.

    I tested this in bash on linux and ksh on solaris.

    Fiddle with options to get the best values for your application. Especially "--full-time" in bash and "-E" in ksh.

    bash

    ls -l foo | awk '{printf "%3s %1s\n", $6, $7}'

    2011-04-19 11:37

    ls --full-time foo | awk '{printf "%3s %1s\n", $6, $7}'

    2011-04-19 11:37:51.211982332

    ksh

    ls -l bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

    May 3 11:19

    ls -E bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

    2011-05-03 11:19:23.723044000 -0400

    0 讨论(0)
  • 2021-01-04 18:44

    I needed something to test age of a specific file, to not re-download too often. So using GNU date and bash:

    # if file's modtime hour is less than current hour:
    [[ $(date +%k -r GPW/mstall.zip) -lt $(date +%k) ]] && \
    wget -S -N \
    http://bossa.pl/pub/metastock/mstock/mstall.zip \
    

    Update--this version works much better for me, and is more accurate and understandable:

    [[ $(date +%s -r mstall.zip) -lt $(date +%s --date="77 min ago") ]] && echo File is older than 1hr 17min
    

    The BSD variant (tested on a Mac) is:

    [[ $(stat -f "%m" mstall.zip) -lt $(date -j -v-77M +%s) ]] && echo File is older than 1hr 17min
    
    0 讨论(0)
  • 2021-01-04 18:45

    Since you're looking to test the time of a specific file you can start by using test and comparing it to your specially created file:

    test /path/to/file -nt /var/tmp/toto
    

    or:

    touch -t YYYYMMDDHHmm.SS /var/tmp/toto
    if [/path/to/file -nt /var/tmp/toto]
       ...
    
    0 讨论(0)
  • 2021-01-04 18:50

    This is now an old question, sorry, but for the sake of others searching for a good solution as I was...

    The best method I can think of is to use the find(1) command which is the only Un*x command I know of that can directly test file age:

    if [ "$(find $file -mmin +58)" != "" ]
    then
      ... regenerate the file ...
    fi
    

    The other option is to use the stat(1) command to return the age of the file in seconds and the date command to return the time now in seconds. Combined with the bash shell math operator working out the age of the file becomes quite easy:

    age=$(stat -c %Y $file)
    now=$(date +"%s")
    if (( (now - age) > (58 * 60) ))
    then
        ... regenerate the file ...
    fi
    

    You could do the above without the two variables, but they make things clearer, as does use of bash math (which could also be replaced). I've used the find(1) method quite extensively in scripts over the years and recommend it unless you actually need to know age in seconds.

    0 讨论(0)
  • 2021-01-04 18:55

    You can use different units in the find command, for example:

    find . -mtime +0h55m
    

    Will return any files with modified dates older than 55 minutes ago.

    0 讨论(0)
提交回复
热议问题