我使用以下命令提取包含许多子目录的大目录的文件名、文件大小和日期。
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
我想要的是:
- 它适用于具有简单名称(如 )的文件
test.gz
,但如果文件具有复杂名称(如[Name] A - A B C_D.zip
; ),则效果很好。它失败并且只返回文件名的最后部分。 - 现在日期是
--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
我会按照建议使用find
with 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}
另一种方式zsh
与zstat
模块
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
如果您想要多于(或少于)两位小数,请调整...