如何在unix中检查文件是否超过30分钟

时间:2014-04-01 08:42:39

标签: shell unix sh unix-timestamp solaris-10

我编写了一个脚本来迭代Solaris中的目录。该脚本会查找超过30分钟且回显的文件。但是,无论文件的大小,我的if条件总是返回true。有人请帮忙解决这个问题。

for f in `ls -1`;
# Take action on each file. $f store current file name
do
  if [ -f "$f" ]; then
  #Checks if the file is a file not a directory
  if test 'find "$f" -mmin +30'
  # Check if the file is older than 30 minutes after modifications
  then
     echo $f is older than 30 mins
  fi
 fi
 done

3 个答案:

答案 0 :(得分:4)

  1. You should not parse the output of ls
  2. 您为每个不必要的文件调用find
  3. 您可以用

    替换整个脚本
    find . -maxdepth 1 -type f -mmin +30 | while IFS= read -r file; do
        [ -e "${file}" ] && echo "${file} is older than 30 mins"
    done
    

    或者,如果Solaris上的默认shell支持进程替换

    while IFS= read -r file; do
        [ -e "${file}" ] && echo "${file} is older than 30 mins"
    done < <(find . -maxdepth 1 -type f -mmin +30)
    

    如果您的系统上有GNU find,则可以在一行中完成所有操作:

    find . -maxdepth 1 -type f -mmin +30 -printf "%s is older than 30 mins\n"
    

答案 1 :(得分:1)

由于您正在遍历目录,因此您可以尝试使用以下命令,该命令将查找在过去30分钟内编辑的所有以日志类型结尾的文件。使用:

  • -mmin +30会在30分钟前编辑所有文件

  • -mmin -30会提供过去30分钟内发生变化的所有文件

find ./ -type f -name "*.log" -mmin -30 -exec ls -l {} \;

答案 2 :(得分:0)

另一种选择是使用来检查时间。像下面的东西应该工作。

for f in *
# Take action on each file. $f store current file name
do
  if [ -f "$f" ]; then
    #Checks if the file is a file not a directory
    fileTime=$(stat --printf "%Y" "$f")
    curTime=$(date +%s)
    if (( ( ($curTime - $fileTime) / 60 ) < 30 ))
      echo "$f is less than 30 mins old"
    then
      echo "$f is older than 30 mins"
    fi
  fi
done