循环遍历子目录内的 json 文件

循环遍历子目录内的 json 文件

我有一个文件夹,里面有子文件夹。我尝试循环遍历每个子文件夹并在 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 不知道在哪里寻找fordo*.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会将查找结果限制为文件,我想你不会有任何像这样命名的目录,但这只是预防措施

相关内容