如何轻松列出文件名及其最后修改日期?求排查脚本异常问题
简便列出文件名与最后修改日期的方法
不需要写脚本的话,直接用系统自带命令就能实现:
- 用
ls命令:ls -l会输出详细信息,包含修改日期;如果要更简洁的格式,可使用ls -lh --time-style=long-iso,其中-h是人性化显示文件大小,--time-style=long-iso会输出YYYY-MM-DD HH:MM格式的日期。 - 用
stat命令:stat -c "%n %y",其中%n代表文件名,%y代表最后修改日期(带时分秒);如果只需要日期部分,可换成%Y(仅日期)。
脚本问题排查(常见导致日期一致的原因)
你的脚本出现所有文件修改日期相同的问题,大概率是以下几种错误:
变量提前赋值,未在循环内更新
错误示例:# 只在循环外获取了一次日期,后续循环复用这个值 mod_date=$(stat -c "%y" "$file") for file in *; do echo "$file $mod_date" done修正方式:将日期获取逻辑放到循环内部,每次循环针对当前文件重新获取:
for file in *; do mod_date=$(stat -c "%y" "$file") echo "$file $mod_date" done错误使用固定文件路径
如果脚本里硬编码了某个固定文件的路径,而非使用循环变量$file,会导致每次都读取同一个文件的日期:
错误示例:for file in *; do # 始终读取"fixed_file.txt"的日期 mod_date=$(stat -c "%y" ./fixed_file.txt) echo "$file $mod_date" done修正方式:把固定路径替换为循环变量
$file,确保每次处理当前遍历到的文件。误用无文件参数的
date命令
如果用date命令但没有加-r指定文件,date默认输出当前系统时间,自然所有文件的日期都显示为脚本运行时刻:
错误示例:for file in *; do mod_date=$(date) echo "$file $mod_date" done修正方式:使用
date -r "$file"获取文件的修改时间:for file in *; do mod_date=$(date -r "$file") echo "$file $mod_date" done循环遍历逻辑错误
如果你的循环是通过ls输出读取文件名(比如for file in $(ls)),当文件名包含空格或特殊字符时,可能会导致$file被拆分,进而无法正确获取对应文件的日期。建议直接用for file in *遍历目录,避免依赖ls的输出。
内容的提问来源于stack exchange,提问作者Ndofi Vontade
相关产品推荐
相关产品推荐

