<===

ProNotes

2025-11-02 21:12:19
**автоматически найдёт все `.txt` файлы** в текущей директории и всех поддиректориях, **объединит их в один файл** и **добавит заголовок с источником** .
все txt файлы в один
---

### Универсальный скрипт (Bash) — ищет все `.txt` файлы рекурсивно

```bash
#!/bin/bash

# Имя выходного файла
OUTPUT="all_txt_combined.txt"

# Очищаем/создаём файл
> "$OUTPUT"

echo "Ищем все .txt файлы в текущей директории и поддиректориях..."
echo "Результат будет сохранён в: $OUTPUT"
echo "===================================================="

# Счётчик
count=0

# Рекурсивно ищем все .txt файлы
find . -type f -name "*.txt" -print0 | sort -z | while IFS= read -r -d '' file; do
    # Пропускаем сам выходной файл
    [[ "$file" == "./$OUTPUT" ]] && continue
    
    # Проверяем, не пустой ли файл
    if [[ -s "$file" ]]; then
        ((count++))
        
        # Относительный путь от текущей директории
        rel_path="${file#./}"
        
        echo "" >> "$OUTPUT"
        echo "===== ИСТОЧНИК: $rel_path =====" >> "$OUTPUT"
        echo "Файл: $rel_path" >> "$OUTPUT"
        echo "Размер: $(wc -l < "$file") строк" >> "$OUTPUT"
        echo "Изменён: $(date -r "$file" '+%Y-%m-%d %H:%M:%S')" >> "$OUTPUT"
        echo "========================================" >> "$OUTPUT"
        echo "" >> "$OUTPUT"
        
        # Копируем содержимое
        cat "$file" >> "$OUTPUT"
        
        # Две пустые строки между файлами
        echo -e "\n\n" >> "$OUTPUT"
        
        echo "Обработан [$count]: $rel_path"
    else
        echo "Пропущен (пустой): $rel_path"
    fi
done

echo ""
echo "ГОТОВО! Обработано файлов: $count"
echo "Результат: $OUTPUT"
echo "Общий размер: $(wc -l < "$OUTPUT") строк"
```

---

### Как использовать:

1. Сохрани скрипт как `combine_txt.sh`
2. Сделай исполняемым:

```bash
chmod +x combine_txt.sh
```

3. Запусти **в папке с файлами**:

```bash
./combine_txt.sh
```

---

### Пример заголовка в результате:

```
===== ИСТОЧНИК: networks.txt/proxmox.txt =====
Файл: networks.txt/proxmox.txt
Размер: 42 строк
Изменён: 2025-11-02 14:30:22
========================================

[содержимое файла...]


===== ИСТОЧНИК: museum/router.txt =====
...
```

---

### Дополнительно: Python-версия (если любишь Python)

```python
#!/usr/bin/env python3
import os
from pathlib import Path
from datetime import datetime

output_file = "all_txt_combined.txt"
root_dir = Path(".")

with open(output_file, 'w', encoding='utf-8') as out:
    txt_files = sorted(root_dir.rglob("*.txt"))
    count = 0
    
    for file in txt_files:
        if file.name == output_file:
            continue
        if file.stat().st_size == 0:
            print(f"Пропущен (пустой): {file}")
            continue
            
        count += 1
        rel_path = file.relative_to(root_dir)
        
        out.write(f"\n===== ИСТОЧНИК: {rel_path} =====\n")
        out.write(f"Файл: {rel_path}\n")
        line_count = len(file.read_text(encoding='utf-8').splitlines())
        out.write(f"Размер: {line_count} строк\n")
        mtime = datetime.fromtimestamp(file.stat().st_mtime)
        out.write(f"Изменён: {mtime.strftime('%Y-%m-%d %H:%M:%S')}\n")
        out.write(f"{'='*43}\n\n")
        
        out.write(file.read_text(encoding='utf-8'))
        out.write("\n\n\n")
        
        print(f"[{count}] {rel_path}")

print(f"\nГОТОВО! Обработано: {count} файлов → {output_file}")
```

---

**Плюсы этого решения:**
- Работает с любой структурой папок
- Автоматически сортирует файлы
- Пропускает пустые и сам выходной файл
- Пишет человекочитаемые заголовки
- Работает в Linux/macOS/Windows (через WSL или Git Bash)

---
← Previous
Back to list