it-swarm.com.de

Durchlaufen Sie JSON-Dateien in Unterverzeichnissen

Ich habe einen Ordner mit Unterordnern. Ich versuche, jeden Unterordner zu durchlaufen und JSON-Dateien in die Mongo-Datenbank zu importieren:

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

Aber das gibt mir einen Fehler:

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

Wenn ich mich in jedem Unterverzeichnis befinde und Folgendes mache:

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

Es klappt.

Was mache ich falsch? Ich bin ganz neu in Ubuntu. Freundliche Grüße

3
user1665355

Sie haben nicht auf "dir" aus Ihrer for -Zeile in Ihrer do -Zeile verwiesen, sodass bash nicht weiß, wo Sie nach den *.json -Dateien suchen sollen, die sich in befinden "$dir"

Sie können dies vereinfachen, indem Sie nur die Dateien abgleichen:

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

Und danke @terdon für die Fehlerbehebung, damit Sie ls nicht analysieren müssen. Dies ist eine sehr schlechte Idee - Vermeiden Sie dies in Zukunft!

6
Zanna

Ich denke, der Befehl find sollte Ihr Ziel erreichen, das Skript würde folgendermaßen aussehen:

#!/bin/bash

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

Dies greift aufgrund der Einstellungen maxdepth und mindepth nur auf direkte Unterverzeichnisse von /data/Mydata zu. "{}" wird jedes Mal auf den Namen der gefundenen Datei erweitert, und der Befehl mongoimport wird jedes Mal ausgeführt, wenn eine Datei gefunden wird.

Ich habe versichert, dass der Befehl mongoimport nicht für Verzeichnisse mit dem Namen something.json ausgeführt werden kann, indem -type f verwendet wird, wodurch das Suchergebnis auf Dateien beschränkt wird. Ich nehme an, Sie haben keine Verzeichnisse wie folgt benannt, aber es ist nur eine Vorsichtsmaßnahme

5
Arronical