根据日期查找文件,而不使用“find”

根据日期查找文件,而不使用“find”

我知道find可以做我想做的事情,但我想知道是否有其他方法可以在文件系统上查找在某个时间点之前/之后或在某个时间创建的文件。

通常,我依靠updatedb&locate来满足大多数文件搜索需求。但这些工具的问题在于,它只有目录和文件名,并且只创建本地目录的数据库,而不是通过 CIFS|NFS 或通过-o loop(例如 .iso 映像)安装的任何内容。

因此,如果我需要在整个系统(本地和远程文件系统)中查找昨天之后创建的文件,我目前需要使用find

如果有的话,还有哪些其他工具可以以类似的方式实现此目的?

我已经尝试过lsgrep,但这需要(就我迄今为止的尝试而言)多次搜索:

ls -lR | grep Aug | grep 10
ls -lR | grep Aug | grep 11

答案1

您可以自定义 ls 的时间戳输出,使其更容易理解:

ls -ln --time-style="+%Y%m%d%H%M%N"

然后,比较日期就和比较字符串一样简单了。您必须使用 awk 执行此操作:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | awk -F " " '$6 > "201108100000000000000" {$1=$2=$3=$4=$5=$6=""; print substr($0, 7)}'

请小心在文件的正确时间使用正确-a或选项。-c

请记住,ctime 不是创建时间,而是 inode 更改的时间(创建、权限、文件大小更改等)。

编辑

甚至可以避免使用 awk:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | \
while read perms inode user group size date file; do
  if [ $date > "201108100000000000000" ]; then
    printf "%s\n" "$file"
  fi
done

答案2

您可以使用 egrep 的替代方案:

ls -lR | egrep "Aug *10|Aug *11"

答案3

对于快速输入的单个命令,我不确定,使用脚本执行一行或多行棘手的命令可能更好。有这样一行,它使用正则表达式,
$ls -lR | grep -E "2011-08-1[01]"
例如 a[bc] 表示 a 后跟 b 或 c。因此 1[01] 涵盖 10 和 11。您可以对 10-13 执行 1[0-3],尽管截至撰写本文时我们还没有确定 13 日的日期。这将是 07 或 08 或 09 或 10 或 11... 13。0[7-9]|1[0123]。

答案4

您可以使用-nt-ot构建 bash 测试。摘自 bash 手册:

文件1-nt 文件2:如果 file1 比 file2 更新(根据修改日期),或者 file1 存在而 file2 不存在,则为真。

文件1-ot文件2:如果 file1 比 file2 旧,或者 file2 存在而 file1 不存在,则为真。

要创建测试临时文件,您可以使用 touch。

要循环遍历目录中的文件,您可以在 bash 测试中使用 shell 扩展和 bash 构建来进行目录测试(-d file)。但要小心文件系统中的链接循环。

相关内容