列出其内容(文件)在特定日期之前尚未更新或访问的所有目录?

列出其内容(文件)在特定日期之前尚未更新或访问的所有目录?

想要轻松找到要存档/垃圾的文件夹,而自动化此操作的一个简单方法是选择我多年来没有使用过的文件夹。由于文件夹本身可以具有与其包含的文件不同的修改日期,我想知道是否已经有一个 *nix 命令可以为我执行此操作。

否则,我想我可以编写一个脚本,首先找到在某个日期之前尚未更新或访问的目录,然后递归循环其内容以确保自该日期以来它们也没有被访问或修改。

但如果这样的工具已经存在,我宁愿不重新发明轮子。

答案1

find /some/where -type d \( -atime +1234 -o -mtime +1234 \) -print | ...

答案2

目录的访问时间很少有用。第一次运行lsfind在目录中时,其访问时间会更新。

您可以简单地查找长时间未访问的文件:

find . -type f -atime +999 -print

如果您只对长时间没有访问过任何文件的目录感兴趣,则可以结合使用find探索目录的命令和find探索目录中文件的命令。

find . -type d -exec sh -c '
    recent=$(find "$0" -mindepth 1 -maxdepth 1 ! -type f -atime +999 -print | head -n 1)
    if [ -z "$recent" ]; then printf %s\\n "$0"; fi
  ' {} +

请注意,此代码片段可以打印出一个目录,其中最近没有访问过任何常规文件,但有最近访问过的文件。单独跳过这些并不容易find,除非您只是单独删除-maxdepth 1以遍历目录,这会触发大量重复磁盘活动。这是一个未经测试的 bash 脚本,它手动执行目录遍历,跟踪哪些目录仅包含最近未访问过的文件。

#!/bin/bash
shopt -s dotglob
explore () {
  local entry keep=
  for entry in "$1/"*; do
    if [ -L "$entry" ]; then
      :
    elif [ -d "$entry" ]; then
      if explore "$entry"; then
        keep=1  # Keep this directory, it contains kept directories
      fi
    elif [ -f "$entry" ]; then
      if [ -z "$(find "$entry" -atime +999 -print)" ]; then
        keep=1  # Keep this directory, it contains a recently-accessed file
      fi
    fi
  done
  if ((!keep)); then
    echo "$1"
    return 1
  fi
  return 0
}
explore .

相关内容