我有一个文件夹,里面有子文件夹。我尝试遍历每个子文件夹并在 mongo 数据库中导入 json 文件:
#!/bin/bash
for dir in /data/Mydata/*/;
do
ls -1 *.json | while read jsonfile;
do
mongoimport --db MyApp --collection logs --file $jsonfile --type json
done;
done;
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
ls: cannot access *.json: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我在每个子目录中并执行以下操作:
ls -1 *.json | while read jsonfile;
do
mongoimport --db MyApp --collection logs --file $jsonfile --type json
done;
Run Code Online (Sandbox Code Playgroud)
有用。
我究竟做错了什么?我对 Ubuntu 很陌生。此致
您还没有在dir您的for行中引用您的行中的“ ” do,因此 bash 不知道在哪里查找其中的*.json文件"$dir"
您可以通过匹配文件来简化:
for jsonfile in /data/Mydata/*/*.json ;
do
mongoimport --db MyApp --collection logs --file "$jsonfile" --type json
done;
Run Code Online (Sandbox Code Playgroud)
并感谢@terdon 解决此问题,因此您不必解析 ls,这是一个非常糟糕的主意- 将来避免这样做!
我认为该find命令应该可以实现您的目标,脚本将变为:
#!/bin/bash
find /data/Mydata/ -maxdepth 2 -mindepth 2 -iname "*.json" -type f -exec mongoimport --db MyApp --collection logs --file "{}" --type json \;
Run Code Online (Sandbox Code Playgroud)
/data/Mydata由于maxdepth和mindepth设置,这将仅访问 的直接子目录。"{}"被扩展为每次找到的文件的名称,并且mongoimport每次找到文件时都会运行该命令。
我已经保证该mongoimport命令不会在任何可能something.json通过 using-type f将查找结果限制为文件命名的目录上运行,我想你不会有任何这样命名的目录,但这只是一种预防措施