![用于捕获 CSV 格式的文件名和文件大小的 Shell 脚本](https://linux22.com/image/37404/%E7%94%A8%E4%BA%8E%E6%8D%95%E8%8E%B7%20CSV%20%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC%20.png)
我在某个文件夹中有许多 zip 文件。我想以包含文件名和大小的 csv 格式捕获文件名和文件大小,每天一个文件。文件名确实包含日期。
文件位于/somedirectory/archive/test
-rw-rw-r--+ 1 AAAA AAAA 9.3M May 30 17:09 XXXXX_20140530_0401_28.txt.gz
-rw-rw-r--+ 1 AAAA AAAA 9.3M May 30 17:09 XXXXX_20140530_0401_29.txt.gz
-rw-rw-r--+ 1 AAAA AAAA 9.3M May 31 17:09 XXXXX_20140531_0401_01.txt.gz
现在我想创建一个 cronjob 每天运行并捕获相同的 csv。
测试30052014.csv
"XXXXX_20140530_0401_28.txt.gz","9.3","May 30"
"XXXXX_20140530_0401_29.txt.gz","9.3","May 30"
测试31052014.csv
"XXXXX_20140531_0401_01.txt.gz","9.3","May 31"
答案1
如果您的系统有 GNU coreutils,那么获取人类可读文件大小的最简单、最可靠的方法可能是通过命令du
。要将输出打印成您想要的格式,使用 bash 您可以执行以下操作:
#!/bin/bash
while read -rd $'\0' size name
do
printf '"%s","%s"\n' "${name##*/}" "$size"
done < <(du -0h /somedirectory/archive/test/XXXXX_20140530_*.gz)
答案2
为什么不直接使用一个快速的 shell 脚本(为了示例,我们将其称为 size.sh):
#!/bin/bash
IFS='
'
for LINE in $(ls -1s --block-size=k|tail -n +2); do
echo $LINE|awk '{ print "\""$2"\",\""$1"\"" }'
done
它以千字节为单位一致输出大小,您可以将脚本的输出重定向到您的文件。
size.sh > $(date +%Y-%m-%d).csv