我想知道 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
由于该文件是今年创建的,因此未显示年份。如果您始终希望显示年份,可以修改代码以始终显示年份。