使用bash测试文件日期

17

我正在尝试使用bash在if语句中测试文件创建时间(以秒为单位)。我需要的是创建日期,而不是修改日期。

你有没有什么想法可以做到这一点,而不使用像findgrep这样的命令?


有许多命令可以用来完成这个任务,bash 可以调用它们中的所有命令。为什么不愿意使用外部命令呢?UNIX 的哲学是建立在工具只做一件事情并且做好这件事情的基础上的。 - paxdiablo
许多常用的文件系统都没有存储创建日期。你使用哪个文件系统? - Martin
问题也在于使用高于VFS的标准工具获取时间,无论时间戳是否存储。对于关于创建时间戳的唯一有效答案加1分... - TheBonsai
Ext2FS / ReiserFS(Linux/Debian) - JeffPHP
我更喜欢创建时间。 - JeffPHP
显示剩余2条评论
4个回答

24

很抱歉我不能回答有关创建时间的问题,但是对于最后修改时间,您可以使用以下方法获取时期日期,以 为单位,自从文件名最后一次被修改以来:

date --utc --reference=filename +%s

那么你可以这样做:

modsecs=$(date --utc --reference=filename +%s)
nowsecs=$(date +%s)
delta=$(($nowsecs-$modsecs))
echo "File $filename was modified $delta secs ago"

if [ $delta -lt 120 ]; then
  # do something
fi

更新 一种更为优雅的方法(仅修改时间):如何在bash中检查文件是否是x时间以前创建的?


8

这是我目前找到的最佳答案,但仅适用于修改时间:

expr `date +%s` - `stat -c %Y /home/user/my_file`

使用%Z代替%Y,您将获得最后更改日期(在我的计算机上的创建日期)。 - Mauro Destro

2
如果您的系统拥有stat
modsecs=$(stat --format '%Y' filename)

你可以像Joel的回答中那样进行数学计算。


1

你可以使用带有--full-time选项的ls命令

file1="file1"
file2="file2"
declare -a array
i=0
ls -go --full-time "$file1" "$file2" | { while read -r  a b c d time f
do    
  time=${time%.*}  
  IFS=":"
  set -- $time
  hr=$1;min=$2;sec=$3
  hr=$(( hr * 3600 ))
  min=$(( min * 60 ))  
  totalsecs=$(( hr+min+sec ))
  array[$i]=$totalsecs  
  i=$((i+1))
  unset IFS      
done
echo $(( ${array[0]}-${array[1]} ))
}  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接