我想找到 *.json2 文件,如果没有执行 POST,检查它们是否执行。
我有
1.json2
2.json2 2.json2.ml
3.json2 3.json2.ml
我用这个命令
find . -type f -name '*.json2' | if [{}.ml]; then -exec sh -c 'curl -X POST -H "Content-Type: application/json" -d @{} https://api.myweb.com/api > {}.ml' \;
我只想执行没有 ml 扩展名的文件。谢谢
答案1
您考虑过使用吗xargs
?
find . -type f -name '*.json2' | xargs bash -c 'for fname; do if [ ! -e ${fname}.ml ]; then curl -X POST -H "Content-Type: application/json" -d @${fname} https://api.myweb.com/api > ${fname}.ml; fi; done' bash
至于尾随bash
,这是我刚刚在网上学到的一个“技巧”xargs 维基百科页面。 (它必须在那里,否则第一个参数不会被处理。)我承认我以前从未使用过它,但我确实使用 echo 命令和一些测试文件测试了它,它似乎做了你想要的事情。
答案2
find . -type f -name '*.json2' -exec sh -c '
for pathname; do
[ -e "$pathname.ml" ] && continue
curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
done' sh {} +
*.json2
这将找到文件名与当前目录中或当前目录下的模式匹配的所有常规文件。对于批量的这些文件,将执行一个简短的 shell 脚本。该脚本针对 给定的每个路径名测试find
是否存在.ml
与该路径名相对应的文件。如果没有,则curl
执行您的命令。
如果所有文件仅位于当前目录中,则可以简化为以下内容:
for pathname in ./*.json2; do
[ -e "$pathname.ml" ] && continue
curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
done
请注意,这本质上是确切地与 调用的脚本中的循环相同find
。唯一的区别是,在第一个示例中,find
充当循环的路径名生成器,而在较短的示例中,路径名是使用通配模式生成的(并且仅从当前目录生成)。
有关的: