目录“递归”最后修改日期

目录“递归”最后修改日期

我想知道 linux bash 中的命令或函数来获取目录中最后修改的文件的时间戳(并且可能格式化其输出)。

假设我有 /path/mydir 并且这个目录里面有一大堆文件。给定其路径,我想输出最近修改的文件的时间戳。

我猜想该过程可以递归执行 foreach 文件,检查所有文件,并在每次找到更新的变量时使用最新时间更新变量。

编辑:抱歉造成混乱,但我想使用纪元时间戳:)

答案1

一种选择:使用 GNU find 递归遍历所有文件;打印时间戳和文件路径并按日期排序:

find /path/mydir -type f -printf "%T+\t%p\n" | sort | tail -1

仅针对纪元时间戳,

find /path/mydir -type f -printf "%T@\n" | sort | tail -1

答案2

鉴于标签以及问题中的“linux bash”规范,这是一个特定于 bash 的函数,它将输出给定目录结构中最近修改的文件的文件名和时间戳:

function lastmodified () (
  shopt -s globstar
  latest=
  t=0
  for f in "$1"/**
  do
    x=$(stat -c "%Y" "$f")
    if [ $x -gt $t ]
    then
      latest="$f"
      t="$x"
    fi
  done
  printf "%s\n" "$latest"
  printf "%s\n" "$(date -d @${t})"
)

像这样使用它:lastmodified /path/mydir.

它在子 shell 中运行以隔离globstar shell 选项以及各种变量赋值。更改或删除 printf 语句以捕获您感兴趣的数据。

它的工作原理是要求 bash 扩展给定$1参数下的所有文件名路径,然后使用以下命令检查“上次修改时间(自纪元以来的秒数)”统计数据命令。最新的文件名将以 结尾$latest,其时间戳以t.

答案3

确保桀骜已安装(所有主要发行版都有一个软件包)。

zsh -c 'ls -log **/*(.om[1])' | awk '{print $4, $5, $6}'

**/*是一个通配符模式递归匹配子目录中的所有文件,并且 (.om[1])全局限定符要将匹配限制为常规文件 ( .),请按修改时间排序 ( om) 并仅保留最近的文件 ( [1])。 Glob 限定符是 zsh 的一个独特功能,它的大部分功能(特别是排序)很难在其他 shell 中重现。

.我只包含常规文件,因为这通常是需要的 - 但例如,如果您希望时间戳反映上次删除文件的时间,您可能需要删除限定符。

GNU ls 有一个控制时间格式的选项 ( --time-style)。请注意,根据时间格式,您可能需要调整后处理以提取时间字段。

或者,您可以使用 Linux 的stat命令或zsh 的stat内置以您想要的格式打印时间戳。

zsh -c 'zmodload zsh/stat; stat +mtime -- **/*(.om[1])'

答案4

find . -type f -exec ls -ltr {} \; | awk '{print $6"-"$7"-"$8" "$9}' | sort -k3 | sort -nr | head -1

输出格式为Month-date-hour-minute filename

Dec-30-03:10 ./1

由于该文件是今年创建的,因此未显示年份。如果您始终希望显示年份,可以修改代码以始终显示年份。

相关内容