Loop sobre arquivos json dentro de subdiretórios

3

Eu tenho uma pasta com subpastas nela. Eu tento fazer um loop sobre cada subpasta e importar arquivos json no banco de dados mongo:

#!/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;

Mas isso me dá um erro:

ls: cannot access *.json: No such file or directory

Se eu estiver dentro de cada subdiretório e fizer isso:

ls -1 *.json | while read jsonfile; 
do 
    mongoimport --db MyApp --collection logs --file $jsonfile --type json
done;

Funciona.

O que estou fazendo de errado? Eu sou muito novo no Ubuntu. Atenciosamente

    
por user1665355 12.09.2016 / 09:24

2 respostas

6

Você não referenciou o " dir " da sua linha for na sua linha do , de modo que o bash não sabe onde procurar os arquivos *.json que estão em "$dir"

Você pode simplificar apenas combinando os arquivos:

for jsonfile in /data/Mydata/*/*.json ; 
do
    mongoimport --db MyApp --collection logs --file "$jsonfile" --type json
done;

E obrigado @terdon por corrigir isso para que você não precise analisar ls, o que é uma idéia muito ruim - evitar que no futuro!

    
por Zanna 12.09.2016 / 09:41
5

Acho que o comando find deve atingir seu objetivo, o script se tornaria:

#!/bin/bash

find /data/Mydata/ -maxdepth 2 -mindepth 2 -iname "*.json" -type f -exec mongoimport --db MyApp --collection logs --file "{}" --type json \;

Isso só acessará os subdiretórios diretos de /data/Mydata , devido às configurações de maxdepth e mindepth . "{}" é expandido para o nome do arquivo encontrado a cada vez, e o comando mongoimport é executado toda vez que um arquivo é encontrado.

Eu assegurei que o comando mongoimport não será executado em nenhum diretório que possa ser denominado something.json usando -type f , o que limita o resultado da localização aos arquivos, imagino que você não tenha nenhum diretório com nomes como este , mas é apenas uma precaução

    
por Arronical 12.09.2016 / 10:58