如何在Bash中遍历文件树并导出文件路径与最后修改时间戳至CSV
没问题,用Bash的原生工具就能高效搞定百万级文件的这个需求,而且比写Node.js脚本更轻量。我来帮你完善思路,直接给出可运行的命令,还会处理CSV格式的细节问题(比如路径里的逗号、引号):
核心命令(直接可用)
# 替换成你的目标目录,比如 ./my-files 或者 /absolute/path/to/dir find ./dir -type f \( -name '*.html' -o -name '*.jpg' -o -name '*.json' -o -name '*.png' -o -name '*.gif' \) \ -printf '%p,%T@\n' | \ sed -e 's/"/""/g' -e '/,/s/^/"/' -e '/,/s/$/"/' > file_list.csv
逐段解释
find部分- 用
\( ... \)把所有-name条件括起来,确保-type f(只找文件,不含目录)和所有文件名后缀条件同时生效(否则原逻辑会出错,可能把目录也混进来)。 - 注意:你原来写的
-name '.png'应该是*.png,前者只会匹配文件名就是.png的文件,后者才是匹配所有PNG后缀的文件,我已经修正了这个小问题。
- 用
-printf输出格式%p:输出文件的相对/绝对路径(取决于你find后面写的是相对还是绝对目录)%T@:输出文件最后修改时间的Unix时间戳(带小数,精确到微秒),如果只需要秒级整数,换成%Ts即可。- 直接用
find内置的-printf是关键——避免为每个文件启动新进程(比如调用stat),百万文件场景下性能提升非常明显。
sed处理CSV规范s/"/""/g:把路径里的双引号替换成两个双引号(CSV的标准转义规则)/,/s/^/"/和/,/s/$/"/:如果路径里包含逗号,自动给整个路径加上双引号,防止逗号被当成CSV的列分隔符。
输出示例(符合CSV规范)
"dir/some/file with,comma.html",1699999999.123456 dir/some/file2.jpg,1699999999.789012 "dir/another file ""with quotes"".png",1700000000.345678
额外优化建议
- 如果需要绝对路径,直接把
find后面的./dir换成绝对路径(比如/home/user/my-files)即可。 - 如果要处理所有文件(不限制后缀),去掉所有
-name相关的条件就行。 - 极端情况(比如路径里有换行符):可以用
find ... -print0配合awk处理NUL分隔符,但这种场景非常少见,普通情况用上面的命令足够。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

