You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.2 KiB
69 lines
2.2 KiB
import os
|
|
from pathlib import Path
|
|
|
|
|
|
def concat_all_md_files(root_dir, output_filename="llm.txt"):
|
|
"""
|
|
Recursively searches for all .md files in directory and subdirectories,
|
|
then concatenates them into a single output file.
|
|
|
|
Args:
|
|
root_dir (str): Root directory to search for .md files
|
|
output_filename (str): Name of output file (default: llm.txt)
|
|
|
|
Returns:
|
|
str: Path to the created output file
|
|
"""
|
|
try:
|
|
root_dir = Path(root_dir).resolve()
|
|
if not root_dir.is_dir():
|
|
raise ValueError(f"Directory not found: {root_dir}")
|
|
|
|
# Collect all .md files recursively
|
|
md_files = []
|
|
for root, _, files in os.walk(root_dir):
|
|
for file in files:
|
|
if file.lower().endswith(".md"):
|
|
full_path = Path(root) / file
|
|
md_files.append(full_path)
|
|
|
|
if not md_files:
|
|
print(
|
|
f"No .md files found in {root_dir} or its subdirectories"
|
|
)
|
|
return None
|
|
|
|
# Create output file in root directory
|
|
output_path = root_dir / output_filename
|
|
|
|
with open(output_path, "w", encoding="utf-8") as outfile:
|
|
for md_file in sorted(md_files):
|
|
try:
|
|
# Get relative path for header
|
|
rel_path = md_file.relative_to(root_dir)
|
|
with open(
|
|
md_file, "r", encoding="utf-8"
|
|
) as infile:
|
|
content = infile.read()
|
|
outfile.write(f"# File: {rel_path}\n\n")
|
|
outfile.write(content)
|
|
outfile.write(
|
|
"\n\n" + "-" * 50 + "\n\n"
|
|
) # Separator
|
|
except Exception as e:
|
|
print(f"Error processing {rel_path}: {str(e)}")
|
|
continue
|
|
|
|
print(
|
|
f"Created {output_path} with {len(md_files)} files merged"
|
|
)
|
|
return str(output_path)
|
|
|
|
except Exception as e:
|
|
print(f"Fatal error: {str(e)}")
|
|
return None
|
|
|
|
|
|
if __name__ == "__main__":
|
|
concat_all_md_files("docs")
|