You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将获取文件信息的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文件的方法

  1. 直接打开CSV:生成的CSV文件可直接用Excel打开,Excel会自动识别逗号分隔的字段。
  2. 另存为Excel格式:在Excel中打开CSV文件后,选择「文件」→「另存为」,选择.xlsx格式保存即可。

内容的提问来源于stack exchange,提问作者Sal Mohamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:45:33