【问题标题】:Returning list of files based on creation date根据创建日期返回文件列表
【发布时间】:2016-08-17 17:03:53
【问题描述】:

我刚开始使用 bourne shell 脚本并尝试编写一个脚本,该脚本将接受两个命令行参数:一个目录和一个文件。我想将文件的创建日期与目录中的文件进行比较并打印所有旧文件,然后打印所有新文件的计数。

这是迄今为止我尝试过的代码,但我知道它无法正确识别目录。

#!/bin/sh

directory=$1
file=$2
x=0

for f in $directory
do 
  if [ $f -ot $file ]
  then
    echo "$f"
    x='expr $x+1'
  fi
done

echo "There are $x newer files"

任何提示将不胜感激! 谢谢

【问题讨论】:

  • 第 1 步将确保您使用的是实际存储文件创建日期的文件系统。大多数没有。 ctime 不是“创建时间”,而是“更改时间”,并且创建后的活动会修改该时间戳。

标签: shell command-line sh


【解决方案1】:

find 命令提供了基于时间戳搜索文件的选项。您想要实现的目标可以在不使用循环的情况下完成:

# Search for files with modification time newer than that of $file
find $directory -newermm $file

# Search for files with modification time older than that of $file
find $directory ! -newermm $file

详情请咨询https://www.gnu.org/software/findutils/manual/html_node/find_html/Comparing-Timestamps.html

但是,如果您正在学习 shell 脚本并想编写自己的脚本,这里有一些建议:

  1. 要遍历目录中的文件,您可以使用:

    for f in "$directory"/*
    
  2. 据我所知,-ot 比较的是修改时间(而不是创建时间)。就此而言,我怀疑 Linux 是否提供文件的创建时间。

  3. 增加x(较新文件的数量)应在else 子句中完成。我更喜欢x=$((x+1)),它在所有符合 POSIX 的 shell 中都受支持。

  4. 警告:使用"$directory/* 进行迭代不会递归到子目录。 find 将递归到子目录中,除非您指定 -maxdepth 选项。

【讨论】:

  • 非常感谢您为我明确了这一点。您是否知道是否有一种方法可以与 find 一样,但对文件进行计数而不是逐个打印出来?
猜你喜欢
  • 2021-08-21
  • 2018-02-03
  • 2013-05-08
  • 2019-06-24
  • 1970-01-01
  • 2021-11-26
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多