如何在Linux中生成带md5sum的递归文件列表并导出为CSV文件
实现方案
ls的输出格式面向人类可读,无法直接输出结构化字段,解析容易出错,使用系统自带的find + stat + md5sum组合即可完成需求,不用安装额外工具,你可以直接使用下面的脚本:
#!/bin/bash # 指定要遍历的目录,替换成你自己的路径 TARGET_DIR="/path/to/your/target/directory" # 导出的CSV文件路径 OUTPUT_CSV="./file_list.csv" # 写入CSV表头 echo "File Name,File Path,File Size (bytes),Created Date Time (dd/mm/yyyy hh:mm:ss),Modified Date Time (dd/mm/yyyy hh:mm:ss),md5sum" > "$OUTPUT_CSV" # 遍历所有普通文件,兼容文件名含空格/特殊字符的场景 find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d '' file; do # 提取文件名 filename=$(basename "$file") # 提取文件大小(字节) filesize=$(stat -c "%s" "$file") # 格式化创建时间,文件系统不支持crtime时输出N/A create_time=$(stat -c "%w" "$file") if [ "$create_time" = "-" ]; then create_time="N/A" else create_time=$(date -d "$create_time" +"%d/%m/%Y %H:%M:%S") fi # 格式化修改时间 modify_time=$(date -d "$(stat -c "%y" "$file")" +"%d/%m/%Y %H:%M:%S") # 计算md5哈希 md5=$(md5sum "$file" | awk '{print $1}') # 处理文件名/路径包含逗号、双引号的场景,符合CSV规范 escaped_filename=$(printf '%s' "$filename" | sed 's/"/""/g; s/^/"/; s/$/"/') escaped_filepath=$(printf '%s' "$file" | sed 's/"/""/g; s/^/"/; s/$/"/') # 写入CSV行 echo "$escaped_filename,$escaped_filepath,$filesize,$create_time,$modify_time,$md5" >> "$OUTPUT_CSV" done
使用说明
- 把脚本中的
TARGET_DIR替换为你需要遍历的实际目录路径 - 给脚本添加执行权限:
chmod +x generate_file_csv.sh - 运行脚本:
./generate_file_csv.sh - 生成的CSV文件默认保存在当前目录的
file_list.csv
注意事项
- 如果你的文件系统不支持存储文件创建时间(比如部分旧的ext3、vfat格式),创建时间列会输出N/A
- 大文件较多时md5计算耗时较长,属于正常情况
- 脚本已经兼容文件名包含空格、逗号、双引号的特殊场景,输出符合CSV标准格式
内容的提问来源于stack exchange,提问作者simonc
相关产品推荐
相关产品推荐

