json - Bash 创建 JSON 文件清单
问题描述
我有一个 bash 脚本来输出带有 MD5 哈希的文件清单作为 JSON,如下所示:
{
"files": [
{
"md5": "f30ae4b2e0d2551b5962995426be0c3a",
"path": "assets/asset_1.png"
},
{
"md5": "ca8492fdc3547af31afeeb8656619ef0",
"path": "assets/asset_2.png"
},
]
}
它将返回除 .gdz 之外的所有文件的列表。
我正在使用的命令是:
echo "{\"files\": [$(find . -type f -print | grep -v \.gdz$ | xargs md5sum | sed 's/\.\///' | xargs printf "{\"md5\": \"%s\", \"name\": \"%s\"}," | sed 's/,$//')]}" > files.json
但是,当我在生产中运行它时,它有时会切换 MD5 哈希和文件路径。我不知道这是为什么,有人知道吗?
解决方案
在 shell 中稳健地执行此操作有点痛苦。您必须担心文件名中的空格(这会破坏您当前的代码)、正确编码和转义您的 JSON 字符串(如果您的文件名称中包含引号怎么办?)等。
一个执行相同操作的快速perl
脚本,将要扫描的目录作为命令行参数传递:
#!/usr/bin/env perl
use warnings;
use strict;
use File::Find;
use Digest::MD5;
use JSON::PP; # Or JSON::XS if installed
my @hashes;
find(\&wanted, @ARGV);
print JSON::PP->new->ascii->encode({files => \@hashes});
sub wanted {
if (-f $_ && $_ !~ /\.gdz$/) {
my $name = $File::Find::name;
$name =~ s!^\./!!;
open my $f, "<:raw", $_ or
die "Couldn't open $name: $!\n";
push @hashes, { path => $name,
md5 => Digest::MD5->new()->addfile($f)->hexdigest
};
close $f;
}
}
推荐阅读
- sql-server - 设置对需要登录数据源的 SSRS 报告的访问
- python - 确定图像给定圆形样本的平均颜色?
- python - AttributeError:“ballcl”对象没有属性“ballX”
- google-apps-script - 通过 Google Apps 脚本为 Google Classroom 分配主题时是否可以使用别名?
- javascript - require.config 不是 .js 文件中的函数
- spring-boot - 如何在 SpringBoot 中将外键添加到新表中
- sql - 数量基于条件
- rxjs - 对理解 RX 中的 Observable 和 Subject 之间的区别感到困惑
- python - 用 SVD 分解求解线性方程组
- c# - 与表 Entity Framework 6 fluent api 添加第二个一对一关系