Another approach may be to filter the json output provided by tree
. For example, tree -J
displays:
[
{"type":"directory","name":"root_directory/","contents":[
{"type":"directory","name":"child_directory","contents":[
{"type":"file","name":"file06.txt"},
{"type":"file","name":"file07.txt"}
]},
{"type":"file","name":"file00.txt"},
{"type":"file","name":"file01.txt"},
{"type":"file","name":"file02.txt"},
{"type":"file","name":"file03.txt"},
{"type":"file","name":"file04.txt"},
{"type":"file","name":"file05.txt"}
]},
{"type":"report","directories":2,"files":8}
]
This json can be filtered to truncate long lists of files.
import json
def truncate_directories(json_data, max_files):
# Parse JSON data
data = json.loads(json_data)
# Iterate through each item in the JSON data
for item in data:
if item.get('type') == 'directory':
contents = item.get('contents')
if contents and len(contents) > max_files:
# Truncate the contents of the directory
item['contents'] = contents[:3] + [{"type": "file", "name": "..."}] + contents[-3:]
# Convert the modified data back to JSON format
return json.dumps(data, indent=2)
# Example JSON data
json_data = '''
[
{"type":"directory","name":"root_directory/","contents":[
{"type":"directory","name":"child_directory","contents":[
{"type":"file","name":"file06.txt"},
{"type":"file","name":"file07.txt"}
]},
{"type":"file","name":"file00.txt"},
{"type":"file","name":"file01.txt"},
{"type":"file","name":"file02.txt"},
{"type":"file","name":"file03.txt"},
{"type":"file","name":"file04.txt"},
{"type":"file","name":"file05.txt"}
]},
{"type":"report","directories":2,"files":8}
]
'''
# Set the maximum number of files allowed in a directory
max_files = 3
# Truncate directories with too many files
new_json_data = truncate_directories(json_data, max_files)
# Print the modified JSON data
print(new_json_data)
[
{
"type": "directory",
"name": "root_directory/",
"contents": [
{
"type": "directory",
"name": "child_directory",
"contents": [
{"type": "file", "name": "file06.txt"},
{"type": "file", "name": "file07.txt"}
]
},
{"type": "file", "name": "file00.txt"},
{"type": "file", "name": "..."}, # TRUNCATED FILES
{"type": "file", "name": "file05.txt"}
]
},
{"type": "report", "directories": 2, "files": 8}
]
In the simulated output, the "root_directory/" contains six files instead of eight. The middle files "file01.txt", "file02.txt", "file03.txt" and "file04.txt" have been replaced with {"type": "file", "name": "..."} to meet the truncation criteria.
If this json is properly output (e.g., as paths or tab indented files), 'tree' should be able to display the custom truncated tree data.
$ tree --help
------- Input options -------
-fromfile Reads paths from files (.=stdin)
--fromtabfile Reads trees from tab indented files (.=stdin)