2014-06-05 13 views
25

ho gruppo di file che si siedono in cartelle comericorsive gatto tutti i file in un solo file

data\A\A\A\json1.json 
data\A\A\A\json2.json 
data\A\A\B\json1.json 
... 
data\Z\Z\Z\json_x.json 

voglio gatto tutte le jsons in un singolo file?

+4

Il risultato non sarà valido JSON, sei sicuro di volerlo fare? – Barmar

risposta

49
find data/ -name '*.json' -exec cat {} \; > uber.json 

una breve spiegazione:

find <where> \ 
    -name <file_name_pattern> \ 
    -exec <run_cmd_on_every_hit> {} \; \ 
    > <where_to_store> 
+1

Senza usare find: 'cat ./data/*/*/*/*.json>./All.json' –

+0

Oppure in' bash' 4 con 'shopt -s globstar',' cat ./data/**/*. json'. – chepner

+0

Dovresti anche aggiungere "-type f" (solo file) per evitare errori quando cat cerca di stampare una directory. –

9

Usa find per ottenere tutti i file JSON e concatenare.

find data -name '*.json' -exec cat {} + > all.json 

Si noti che questo non sarà valido JSON. Se si desidera che un file JSON contenga più oggetti, è necessario trovarsi in un array o oggetto contenente, quindi è necessario aggiungere [ ] e inserire , tra ciascuno di essi.

+2

Vorrei aggiungere anche un parametro '-type f' al comando' find'. – palacsint

+2

Strettamente vero, ma sarebbe piuttosto perverso avere directory con estensioni '.json'. – Barmar

+0

Come si aggiungono i caratteri "," nel comando sopra tra ogni file? –

8

alternativa - se si dispone di un elenco dei file - è possibile tubo che a xargs

<path to your files> | xargs cat > all.json 
+2

per ottenere una lista in modo ricorsivo: trova \ 'pwd \' – Alan