我有一个文件夹,里面有子文件夹。我尝试循环遍历每个子文件夹并在 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;
但这给了我一个错误:
ls: cannot access *.json: No such file or directory
如果我在每个子目录中并执行:
ls -1 *.json | while read jsonfile;
do
mongoimport --db MyApp --collection logs --file $jsonfile --type json
done;
有用。
我做错了什么?我对 Ubuntu 还很陌生。此致
答案1
你没有在你的行中引用“ dir
” ,所以 bash 不知道在哪里寻找for
do
*.json
"$dir"
您可以通过匹配文件来简化:
for jsonfile in /data/Mydata/*/*.json ;
do
mongoimport --db MyApp --collection logs --file "$jsonfile" --type json
done;
感谢 @terdon 修复了这个问题,这样你就不必解析 ls,这是一个非常糟糕的想法- 以后避免再发生这种情况!
答案2
我认为该find
命令应该可以实现你的目标,脚本将变成:
#!/bin/bash
find /data/Mydata/ -maxdepth 2 -mindepth 2 -iname "*.json" -type f -exec mongoimport --db MyApp --collection logs --file "{}" --type json \;
/data/Mydata
由于maxdepth
和设置,这将仅访问的直接子目录mindepth
。"{}"
扩展为每次找到的文件的名称,并且mongoimport
每次找到文件时都会运行该命令。
我已经确保该mongoimport
命令不会在任何可能使用 命名的目录上运行,something.json
这-type f
会将查找结果限制为文件,我想你不会有任何像这样命名的目录,但这只是预防措施