使用bashshell从json字符串中的文件夹映射文件名
如何使用bashshell实现文件夹及其嵌套文件夹中所有扩展名为.yaml的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
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
(请参阅的应用程序用法和基本原理部分,以及bashxpg_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
,这通常是不可靠的(请参阅的应用程序用法和基本原理部分,以及bashxpg_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部分。