使用bashshell从json字符串中的文件夹映射文件名

使用bashshell从json字符串中的文件夹映射文件名,bash,shell,unix,scripting,Bash,Shell,Unix,Scripting,如何使用bashshell实现文件夹及其嵌套文件夹中所有扩展名为.yaml的json字符串的文件名 文件夹示例: folder/ filename-1.yaml readme.md nested-folder/ filename-2.yaml filename-3.yaml robots.txt 预期结果: [{name:\'filename-1\”,url:\“/names/filename-1.yaml\”,{name:\'nested f

如何使用bashshell实现文件夹及其嵌套文件夹中所有扩展名为.yaml的json字符串的文件名

文件夹示例:

 folder/
   filename-1.yaml
   readme.md
   nested-folder/
     filename-2.yaml
     filename-3.yaml
     robots.txt
预期结果:

[{name:\'filename-1\”,url:\“/names/filename-1.yaml\”,{name:\'nested folder/filename-2\,url:\“/names/filename-2.yaml\”,{name:\'nested folder/filename-3.yaml\”,url:\“/names/filename-3.yaml\”,
类似的内容

DIR=/path/to/folder;

echo [ 
let I=0
find "$DIR" -name '*.yaml' | while read F; do
    let I++;
    N="$(basename "$F")";
    N="${N/%.yaml/}";
    [ $I != 1 ] && echo ,
    echo -n '  { "name": "'"$N"'", "url":"'"${F/#$DIR/}"'" }'
done
[ $I == 0 ] || echo;
echo ]
像这样的

DIR=/path/to/folder;

echo [ 
let I=0
find "$DIR" -name '*.yaml' | while read F; do
    let I++;
    N="$(basename "$F")";
    N="${N/%.yaml/}";
    [ $I != 1 ] && echo ,
    echo -n '  { "name": "'"$N"'", "url":"'"${F/#$DIR/}"'" }'
done
[ $I == 0 ] || echo;
echo ]

更安全的方法是让类似
jq
的JSON感知工具找出如何转义你的名字;这甚至适用于带有引号、制表符、文字换行符、文字反斜杠和其他不寻常但完全合法的字符的名称

find /path/to/folder -type f -name '*.yaml' -printf '%P\0' |
  jq -Rs '[ split("\u0000") | .[] |
            { "name": capture("^(?<name>.*)[.]yaml$").name,
              "url": "/names/\(.)" } ]'
find/path/to/folder-type f-name'*.yaml'-printf'%P\0'|
jq-Rs'[拆分(“\u0000”)|.[]|
{“name”:捕获(“^(?.*[.]yaml$”)。name,
“url”:“/names/\(.)“}]”

更安全的方法是让类似于
jq
的JSON感知工具找出如何转义你的名字;这甚至适用于带有引号、制表符、文字换行符、文字反斜杠和其他不寻常但完全合法的字符的名称

find /path/to/folder -type f -name '*.yaml' -printf '%P\0' |
  jq -Rs '[ split("\u0000") | .[] |
            { "name": capture("^(?<name>.*)[.]yaml$").name,
              "url": "/names/\(.)" } ]'
find/path/to/folder-type f-name'*.yaml'-printf'%P\0'|
jq-Rs'[拆分(“\u0000”)|.[]|
{“name”:捕获(“^(?.*[.]yaml$”)。name,
“url”:“/names/\(.)“}]”

获取带有
basename
的文件名。所以只需以json格式输出
echo“{name:\”$(basename“${arr[$i]}.yaml)\”,url:\“$(这里也有东西)\”}
@KamilCuk谢谢,它很有效!如何将结果作为json字符串放入一个变量?@dima\u bur,对于任何答案,
var=$(…代码…)
,正如我们有其他Q&A条目描述的那样。获取一个带有
basename
的文件名。所以只需以json格式
输出“{name:\”$(basename“${arr[$i]}.yaml)\”,url:\“$(这里也有些东西)\”}
@KamilCuk谢谢,它能工作!以及如何将结果作为json字符串放入一个变量?@dima_-bur,对于任何答案,
var=$(…代码…
),因为我们有其他Q&A条目描述。如果文件名包含
。它通常也是非常奇怪的代码——使用非POSIX语法
let
,bash在1992年之前的非POSIX Bourne中支持该语法;使用与任何基线POSIX外壳完全不兼容的
==
,使用通常不可靠的
echo-n
(请参阅的应用程序用法和基本原理部分,以及bash
xpg_echo
标志与
set-o POSIX
的交互),等等。(顺便说一句,只有所有caps变量名可以修改shell和实用程序的行为,使名称至少保留一个小写字符供应用程序使用,而不会无意中修改shell行为)。(另外,
N=“${N/%.yaml/}”
是一种bashism,而等效的
N=${N%.yaml}与所有POSIX族外壳都更短和兼容;我同样会考虑<代码> n=${f*y***/}。
作为调用外部
basename
命令的更有效的替代方法--
dirname
具有一些特殊的大小写逻辑,使其比类似的PE更正确,但
basename
)的情况并非如此。如果文件名包含
。它通常也是非常奇怪的代码——使用非POSIX语法
let
,bash支持1992年以前的非POSIX Bourne;使用
=
,这与任何基本POSIX shell都不兼容,使用
echo-n
,这通常是不可靠的(请参阅的应用程序用法和基本原理部分,以及bash
xpg_echo
标志与
set-o posix
的交互)等。(顺便说一句,只有所有caps变量名可以修改shell和实用程序的行为,使名称至少保留一个小写字符供应用程序使用,而不会无意中修改shell行为)。(另外,
N=“${N/%.yaml/}”
是一种bashism,而等效的
N=${N%.yaml}与所有POSIX族外壳都更短和兼容;我同样会考虑<代码> n=${f*y***/}。
作为调用外部
basename
命令的更有效的替代方法--
dirname
具有一些特殊的大小写逻辑,使其比类似的PE更正确,但
basename
的情况并非如此。).@dima_-bur,…顺便说一句,我编辑此内容是为了涵盖我先前遗漏的问题中的过滤-.yaml部分。@dima_-bur,…顺便说一句,我编辑此内容是为了涵盖我先前遗漏的问题中的过滤-.yaml部分。