「find」を使用してルート構造からディレクトリ構造を出力してきましたが、少し時間がかかってもかまいません。私の問題は、すべてのファイルパスを繰り返すという冗長な情報を削減したいことです。JSON形式でファイルを出力したいのです。
ターミナルからこれを実行できるようにする必要があります。ボックスにpythonファイルなどを作成できません)。
たとえば、これ:
root
|_ fruits
|___ Apple
|______images
|________ Apple001.jpg
|________ Apple002.jpg
|_ animals
|___ cat
|______images
|________ cat001.jpg
|________ cat002.jpg
のようなものになるでしょう...
{"data" : [
{
"type": "folder",
"name": "animals",
"path": "/animals",
"children": [
{
"type": "folder",
"name": "cat",
"path": "/animals/cat",
"children": [
{
"type": "folder",
"name": "images",
"path": "/animals/cat/images",
"children": [
{
"type": "file",
"name": "cat001.jpg",
"path": "/animals/cat/images/cat001.jpg"
}, {
"type": "file",
"name": "cat001.jpg",
"path": "/animals/cat/images/cat002.jpg"
}
]
}
]
}
]
}
]}
これは、再帰を使用して目的のスキーマを出力する必要のある簡単なPythonプログラムです。Python 2と3の両方で動作するはずです(ただし、2でのみテストしました)。最初の引数は、その先にあるディレクトリです。デフォルトでは、スクリプトは現在のディレクトリを使用します。
#!/usr/bin/env python
import os
import errno
def path_hierarchy(path):
hierarchy = {
'type': 'folder',
'name': os.path.basename(path),
'path': path,
}
try:
hierarchy['children'] = [
path_hierarchy(os.path.join(path, contents))
for contents in os.listdir(path)
]
except OSError as e:
if e.errno != errno.ENOTDIR:
raise
hierarchy['type'] = 'file'
return hierarchy
if __name__ == '__main__':
import json
import sys
try:
directory = sys.argv[1]
except IndexError:
directory = "."
print(json.dumps(path_hierarchy(directory), indent=2, sort_keys=True))