2014-06-05 28 views
25

Mam kilka plików w folderach siedzą jakrekurencyjne cat wszystkie pliki w jednym pliku

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 

chcę kota wszystkie jsons w jeden plik?

+4

Wynik nie będzie ważne JSON, jesteś pewien, że chcesz to zrobić? – Barmar

Odpowiedz

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

krótkie wyjaśnienie:

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

Bez użycia find: 'cat ./data/*/*/*/*.json> ./ all.json' –

+0

Lub w' bash' 4 z 'shopt -s globstar',' cat ./data/**/*. json'. – chepner

+0

Powinieneś także dodać "-type f" (tylko pliki), aby uniknąć błędów, gdy kot próbuje wydrukować katalog. –

9

Zastosowanie find uzyskać wszystkie pliki JSON i złączyć je.

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

Należy pamiętać, że nie będzie to poprawne JSON. Jeśli chcesz, aby plik JSON zawierał wiele obiektów, muszą one znajdować się w tablicy lub obiekcie zawierającym obiekt, dlatego musisz dodać do nich [ ] i umieścić między nimi .

+2

Dodałbym również parametr '-type f' do polecenia' find'. – palacsint

+2

Ściśle prawdziwe, ale byłoby całkiem perwersyjnie mieć katalogi z rozszerzeniami '.json'. – Barmar

+0

Jak dodać znaki "," w powyższym poleceniu między poszczególnymi plikami? –

8

Alternatywnie - jeśli masz listę plików - można rura że do xargs

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

, aby uzyskać listę rekurencyjnie: znajdź \ 'pwd \ ' – Alan