对于那里的人来说,这可能是也可能不是一件容易的事情......
我正在尝试构建文件还原服务。我有一本看起来像这样的字典。
{'full_path': '/home/michael/Data',
'items': {'UpgradeToCentOS5': {'full_path': '/home/michael/Data/UpgradeToCentOS5',
'type': 'f',
'versions': ['current', '09/10/12']},
'basic_debian': {'full_path': '/home/michael/Data/basic_debian',
'type': 'f',
'versions': ['current']},
'deploy.tgz': {'full_path': '/home/michael/Data/deploy.tgz',
'type': 'f',
'versions': ['current']},
'firewall': {'full_path': '/home/michael/Data/firewall',
'type': 'f',
'versions': ['current']},
'legalholder.sh': {'full_path': '/home/michael/Data/legalholder.sh',
'type': 'f',
'versions': ['current']},
'lists': {'full_path': '/home/michael/Data/lists',
'items': {'boothosts': {'full_path': '/home/michael/Data/lists/boothosts',
'type': 'f',
'versions': ['current']},
'checklist': {'full_path': '/home/michael/Data/lists/checklist',
'type': 'f',
'versions': ['current']},
'ns_ip': {'full_path': '/home/michael/Data/lists/ns_ip',
'type': 'f',
'versions': ['current']},
'server_info': {'full_path': '/home/michael/Data/lists/server_info',
'type': 'f',
'versions': ['current']},
'temp': {'full_path': '/home/michael/Data/lists/temp',
'type': 'f',
'versions': ['current']},
'tsm_clients': {'full_path': '/home/michael/Data/lists/tsm_clients',
'type': 'f',
'versions': ['current']}},
'type': 'd',
'versions': ['current']},
'salt': {'full_path': '/home/michael/Data/salt',
'type': 'f',
'versions': ['current']},
'std-srv': {'full_path': '/home/michael/Data/std-srv',
'type': 'f',
'versions': ['current']},
'upgrade_debian_6': {'full_path': '/home/michael/Data/upgrade_debian_6',
'type': 'f',
'versions': ['current']},
'using-imaps': {'full_path': '/home/michael/Data/using-imaps',
'type': 'f',
'versions': ['current']},
'xiv_online_resize': {'full_path': '/home/michael/Data/xiv_online_resize',
'type': 'f',
'versions': ['current']}},
'type': 'd',
'versions': ['current']}
基本上......它是我发现可以恢复的数据的字典。所有文件(不确定目录)都有“版本”,这是该文件存在的版本列表。
我正在试图弄清楚我将如何将其转换为HTML数据,用户可以使用它来选择他们想要恢复的文件版本。 (限制是每个文件的一个版本恢复。
我从未构建过这样的东西,而且我没有在搜索中提起任何东西。
我的细节中缺少什么?
我想/我正在寻找的是这样的......- home
-- /michael
--- /Data
---- UpgradeToCentOS5
□ Version: current
□ Version: 09/10/12
---- basic_debian
□ Version: current
---- deploy.tgz
□ Version: current
---- firewall
□ Version: current
---- legalholder.sh
□ Version: current
---- lists
----- boothosts
□ Version: current
[...]
答案 0 :(得分:1)
我用它来制作类似你的例子。
recovery = {'full_path': '/home/michael/Data',
'items': {'UpgradeToCentOS5': {'full_path': '/home/michael/Data/UpgradeToCentOS5',
'type': 'f',
'versions': ['current', '09/10/12']},
'basic_debian': {'full_path': '/home/michael/Data/basic_debian',
'type': 'f',
'versions': ['current']},
'deploy.tgz': {'full_path': '/home/michael/Data/deploy.tgz',
'type': 'f',
'versions': ['current']},
'firewall': {'full_path': '/home/michael/Data/firewall',
'type': 'f',
'versions': ['current']},
'legalholder.sh': {'full_path': '/home/michael/Data/legalholder.sh',
'type': 'f',
'versions': ['current']},
'lists': {'full_path': '/home/michael/Data/lists',
'items': {'boothosts': {'full_path': '/home/michael/Data/lists/boothosts',
'type': 'f',
'versions': ['current']},
'checklist': {'full_path': '/home/michael/Data/lists/checklist',
'type': 'f',
'versions': ['current']},
'ns_ip': {'full_path': '/home/michael/Data/lists/ns_ip',
'type': 'f',
'versions': ['current']},
'server_info': {'full_path': '/home/michael/Data/lists/server_info',
'type': 'f',
'versions': ['current']},
'temp': {'full_path': '/home/michael/Data/lists/temp',
'type': 'f',
'versions': ['current']},
'tsm_clients': {'full_path': '/home/michael/Data/lists/tsm_clients',
'type': 'f',
'versions': ['current']}},
'type': 'd',
'versions': ['current']},
'salt': {'full_path': '/home/michael/Data/salt',
'type': 'f',
'versions': ['current']},
'std-srv': {'full_path': '/home/michael/Data/std-srv',
'type': 'f',
'versions': ['current']},
'upgrade_debian_6': {'full_path': '/home/michael/Data/upgrade_debian_6',
'type': 'f',
'versions': ['current']},
'using-imaps': {'full_path': '/home/michael/Data/using-imaps',
'type': 'f',
'versions': ['current']},
'xiv_online_resize': {'full_path': '/home/michael/Data/xiv_online_resize',
'type': 'f',
'versions': ['current']}},
'type': 'd',
'versions': ['current']}
import os
def get_parent_dirs(path):
parents = []
x = path.split('/')[1:-1]
for i in range(len(x)):
parents.append('/'.join(x[0:i+1]))
return parents
# Get a list of files and versions from the dictionary
items = []
pending = [recovery]
while pending:
x = pending.pop(0)
for item in x['items']:
item = x['items'][item]
if item.has_key('items'): # a directory
pending.append(item)
else: # a file
items.append((item['full_path'], item['versions']))
items.sort()
parent_dirs = []
for path, versions in items:
# Print parent directories if necessary
for directory in get_parent_dirs(path):
if not directory in parent_dirs:
parent_dirs.append(directory)
print '%s /%s' % (len(directory.split('/'))*'-', os.path.split(directory)[1])
# Print file versions
directory, filename = os.path.split(path)
padding = len(path.split('/'))-1
print '%s %s' % (padding*'-', filename)
for version in versions:
print '%s [] Version: %s' % (' '*padding, version)