如何用Bash或Perl按创建时间将TXT文件名转为指定JSON格式
需求描述
当前目录文件列表如下:
➜ tmp.lDrLPUOF ls 1.txt 2.txt 3.txt 1.zip 2.rb
需要将所有TXT文件按创建时间升序排序后,生成特定JSON格式。文件创建时间如下:
➜ tmp.lDrLPUOF ls -lTr total 0 -rw-r--r-- 1 administrator staff 0 Oct 12 09:35:05 2022 3.txt -rw-r--r-- 1 administrator staff 0 Oct 12 09:35:08 2022 2.txt -rw-r--r-- 1 administrator staff 0 Oct 12 09:35:12 2022 1.txt
最终期望的JSON格式:
{ "": [ { "title": "", "file": "3" }, { "title": "", "file": "2" }, { "title": "", "file": "1" } ] }
请问能否用Bash或Perl实现该需求?
实现方案
方法一:Bash结合jq实现
利用ls按创建时间排序,提取文件名后通过jq构建合法JSON:
分步写法(易读性高)
# 初始化JSON结构 echo '{"": [' > output.json # 遍历排序后的txt文件,生成每个条目 ls -lTr *.txt | awk '{print $NF}' | sed 's/\.txt$//' | while read -r fname; do echo " {\"title\": \"\", \"file\": \"$fname\"}," done | sed '$ s/,$//' >> output.json # 闭合JSON结构 echo ']}' >> output.json
简洁管道写法
ls -lTr *.txt | awk '{sub(/\.txt$/,"",$NF); print $NF}' | \ jq -n --argjson items "$(jq -R '.' | jq -s 'map({"title": "", "file": .})')" \ '{"": $items}'
方法二:Perl实现
Perl可直接完成文件排序与JSON生成,无需依赖外部工具:
use strict; use warnings; use JSON; # 按文件创建时间(stat的第11个字段)升序获取所有txt文件 my @files = sort { (stat $a)[10] <=> (stat $b)[10] } glob "*.txt"; # 处理文件名并构建条目数组 my @items; foreach my $file (@files) { $file =~ s/\.txt$//; push @items, { title => "", file => $file }; } # 生成带格式的JSON并输出 my $json = JSON->new->pretty; print $json->encode({ "" => \@items });
内容的提问来源于stack exchange,提问作者hustnzj
相关产品推荐
相关产品推荐

