使用文件名、生成时间和文件大小(以 GB 为单位)创建 csv

使用文件名、生成时间和文件大小(以 GB 为单位)创建 csv

我使用以下命令提取包含许多子目录的大目录的文件名、文件大小和日期。

find MY_PATH -type f -exec ls -la --block-size=GB --time-style=+%Y-%m-%d_%H:%M:%S {} \; | awk  -F " |/" -v OFS=',' '{print $5,$6,$NF;}' > fileName.csv

我想要的是:

  1. 它适用于具有简单名称(如 )的文件test.gz,但如果文件具有复杂名称(如[Name] A - A B C_D.zip; ),则效果很好。它失败并且只返回文件名的最后部分。
  2. 现在日期是--time-style=+%Y-%m-%d_%H:%M:%S,我添加_以避免将日期拆分为两个新列。但是我想使用space而不是_但仍然将日期作为一列返回。

以下是一个目录中一些文件的名称;我有很多这样的目录。

[www.google.com] Learn - Complete SQL and Databases Bootcamp Zero to Mastery 2022.zip
[www.google.com] Learn - MongoDB - The Complete Developer's Guide 2022.zip
[www.google.com] Learn - SQL - The Complete Developer's Guide (MySQL, PostgreSQL).zip
[www.google.com] Learn - The Complete Oracle SQL Bootcamp (2022).zip

预期的输出是CSV包含列的文件name,size,date

答案1

我会按照建议使用findwith printf,然后处理第一个字段以将字节转换为吉布例如

find . -type f -printf '%s %TF %.8TT %p\n' | numfmt --to-unit=1073741824 --format='%.2f GiB'

这假设文件名中没有嵌入换行符。它应该根据你的OP打印mtime和大小吉布带有两位小数...您始终可以自定义时间戳和大小的格式 - 请分别查阅手册find(请参阅-printf部分)和numfmt(请参阅--format


正如我所说,要将它们以逗号分隔或按其他顺序排列,请调整格式:

find . -type f -printf '%f,%s,%TF %.8TT\n' | \
numfmt --delimiter=, --field=2 --to-unit=1073741824 --format='%.2f GiB'

尽管这假设您的文件名不包含逗号。如果这样做,您可能可以使用低 ascii 字符作为分隔符并运行类似的命令

s=$'\002'
find . -type f -printf "%f,${s}%s${s},%TF %.8TT\n" | numfmt -d${s} --field=2 --to-unit=1073741824 --format='%.2f GiB' | tr -d ${s}

另一种方式zshzstat模块

zmodload zsh/stat
for f in **/*(.D)
do
sz=$(( $(zstat +size $f)/1073741824. ))
mt=$(zstat -F '%F %T' +mtime $f)
printf '%s,%.2f,%s\n' $f:t ${sz} ${mt}
done

%.2f如果您想要多于(或少于)两位小数,请调整...

相关内容