如何将获取文件信息的Shell脚本输出转换为CSV文件?
问题描述
我写了一段Shell脚本,用stat和du命令获取指定目录下子文件的名称、大小以及创建、访问、修改、变更时间,用来帮客户筛选需要归档的文件。现在脚本的输出只显示在终端,请问怎么把这些输出转换成CSV或Excel文件?
以下是我的脚本代码:
echo "Please type in the directory" read directory for entry in "$directory"/* do modDate=$(stat -c %y "$entry") modDate1=$(stat -c %x "$entry") modDate2=$(stat -c %z "$entry") modDate3=$(du -sh "$entry"|awk '{print $1}') modDate4=$(stat -c %w "$entry") modDate5=$(stat -c %n "$entry") modDate=${modDate%% *} modDate1=${modDate1%% *} modDate2=${modDate2%% *} modDate4=${modDate4%% *} echo File Name:$modDate5 Size:$modDate3 Created:$modDate4 Accessed:$modDate1 Modified:$modDate Changed:$modDate2 done
终端执行示例:
root@xizsdap1x:/home/o722823a# ./find.sh Please type in the directory READS /sasdata/userdata01 OUTPUT File Name:/sasdata/userdata01/db1 Size:153G Created:2018-04-10 Accessed:2022-12-14 Modified:2018-05-31 Changed:2018-05-31 File Name:/sasdata/userdata01/db2 Size:1.9T Created:2018-04-10 Accessed:2022-12-14 Modified:2020-04-21 Changed:2022-02-01 File Name:/sasdata/userdata01/db3 Size:819G Created:2018-04-10 Accessed:2022-12-14 Modified:2017-10-27 Changed:2018-11-13 File Name:/sasdata/userdata01/db4 Size:702G Created:2018-04-10 Accessed:2022-12-14 Modified:2018-04-03 Changed:2018-05-26 File Name:/sasdata/userdata01/dbqa Size:2.7T Created:2020-08-05 Accessed:2022-12-14 Modified:2021-05-22 Changed:2022-09-06 File Name:/sasdata/userdata01/proj22 Size:712G Created:2018-08-07 Accessed:2022-12-14 Modified:2018-04-03 Changed:2020-02-28 File Name:/sasdata/userdata01/proj26 Size:627G Created:2022-05-25 Accessed:2022-12-14 Modified:2022-06-03 Changed:2022-06-03 File Name:/sasdata/userdata01/proj39 Size:1.3T Created:2019-09-29 Accessed:2022-12-14 Modified:2019-12-11 Changed:2019-12-11
解决方案
方法一:修改脚本直接输出CSV格式
直接调整脚本输出标准CSV格式(带表头、字段用逗号分隔),可直接保存为.csv文件。修改后的脚本如下:
echo "Please type in the directory" read directory # 输出CSV表头 echo "File Name,Size,Created,Accessed,Modified,Changed" for entry in "$directory"/* do # 一次性获取stat相关字段,减少命令调用次数 stat_info=$(stat -c "%y %x %z %w %n" "$entry") size=$(du -sh "$entry" | awk '{print $1}') # 提取并处理日期字段(仅保留日期部分) modDate=$(echo "$stat_info" | awk '{print $1}') accessedDate=$(echo "$stat_info" | awk '{print $2}') changedDate=$(echo "$stat_info" | awk '{print $3}') createdDate=$(echo "$stat_info" | awk '{print $4}') fileName=$(echo "$stat_info" | cut -d' ' -f5-) # 兼容文件名含空格的情况 # 输出CSV行,字段用引号包裹避免特殊字符干扰 echo "\"$fileName\",\"$size\",\"$createdDate\",\"$accessedDate\",\"$modDate\",\"$changedDate\"" done
使用方式
执行脚本时将输出重定向到CSV文件:
./find.sh > file_info.csv
生成的file_info.csv可直接用Excel打开。
方法二:处理现有脚本输出生成CSV
若不想修改原脚本,可通过awk工具提取终端输出的字段并生成CSV:
步骤1:保存原脚本输出
先将原脚本的输出保存到文本文件:
./find.sh > raw_output.txt
步骤2:用awk转换为CSV
执行以下命令,从raw_output.txt提取字段并生成CSV:
echo "File Name,Size,Created,Accessed,Modified,Changed" > file_info.csv awk '/File Name:/ { fileName=substr($0, index($0,":")+1, index($0," Size:")-index($0,":")-1) size=substr($0, index($0,"Size:")+5, index($0," Created:")-index($0,"Size:")-5) created=substr($0, index($0,"Created:")+8, index($0," Accessed:")-index($0,"Created:")-8) accessed=substr($0, index($0,"Accessed:")+9, index($0," Modified:")-index($0,"Accessed:")-9) modified=substr($0, index($0,"Modified:")+9, index($0," Changed:")-index($0,"Modified:")-9) changed=substr($0, index($0,"Changed:")+8) print "\""fileName"\",\""size"\",\""created"\",\""accessed"\",\""modified"\",\""changed"\"" }' raw_output.txt >> file_info.csv
转换为Excel文件的方法
- 直接打开CSV:生成的CSV文件可直接用Excel打开,Excel会自动识别逗号分隔的字段。
- 另存为Excel格式:在Excel中打开CSV文件后,选择「文件」→「另存为」,选择
.xlsx格式保存即可。
内容的提问来源于stack exchange,提问作者Sal Mohamed
相关产品推荐
相关产品推荐

