Flatten Directory Structure | Cododel
CODODELDEV
EN / RU
Back to Deck
[shell]

Flatten Directory Structure

ИСХОДНИК Bash
ВЕРСИЯ 1.0
АВТОР Cododel

Bash скрипт, который выравнивает вложенные структуры директорий, перемещая все файлы из поддиректорий на корневой уровень. Автоматически обрабатывает конфликты имен файлов и очищает пустые директории.

Возможности

  • Рекурсивное перемещение файлов: Находит все файлы во вложенных поддиректориях
  • Разрешение конфликтов: Автоматически переименовывает дубликаты с _1, _2 и т.д.
  • Сохранение расширений: Сохраняет расширения файлов при переименовании
  • Очистка пустых директорий: Удаляет пустые поддиректории после перемещения
  • Безопасные операции: Использует абсолютные пути для предотвращения ошибок

Применение

Идеально для очистки захламленных папок загрузок, организации извлеченных архивов или консолидации разбросанных файлов:

Terminal window
# Выравнивание захламленной папки загрузок
./flatten-dirs.sh ~/Downloads/project
# Консолидация извлеченного архива
./flatten-dirs.sh ./extracted_files
# Очистка вложенных фото-директорий
./flatten-dirs.sh ~/Pictures/vacation

Пример До и После

До:

my-folder/
├── file1.txt
├── subdir1/
│ ├── file2.txt
│ └── file1.txt (конфликт!)
└── subdir2/
└── nested/
└── file3.jpg

После:

my-folder/
├── file1.txt
├── file1_1.txt (переименован для избежания конфликта)
├── file2.txt
└── file3.jpg

Как это работает

  1. Валидация: Проверяет существование директории
  2. Абсолютный путь: Конвертирует ввод в абсолютный путь
  3. Поиск файлов: Находит все файлы на глубине ≥2
  4. Обнаружение конфликтов: Проверяет существующие файлы с тем же именем
  5. Умное переименование: Добавляет суффикс _N перед расширением при конфликте
  6. Перемещение: Перемещает файлы в корневую директорию
  7. Очистка: Удаляет пустые поддиректории

Использование

Terminal window
# Базовое использование
./flatten-dirs.sh <директория>
# Пример
./flatten-dirs.sh ~/Downloads/nested_folder

Пример вывода

Moved: /path/to/folder/subdir/file.txt -> /path/to/folder/file.txt
Moved: /path/to/folder/another/file.txt -> /path/to/folder/file_1.txt
Moved: /path/to/folder/deep/nested/image.jpg -> /path/to/folder/image.jpg
Directory structure flattened

Исходный код

flatten-dirs.sh

#!/bin/bash
# Check if directory is provided
if [ $# -ne 1 ]; then
echo "Usage: $0 <directory>"
exit 1
fi
# Check if directory exists
if [ ! -d "$1" ]; then
echo "Error: Directory '$1' does not exist"
exit 1
fi
# Convert to absolute path
target_dir=$(realpath "$1")
# Find all files in subdirectories and move them to root
find "$target_dir" -type f -mindepth 2 | while read -r file; do
filename=$(basename "$file")
dest="$target_dir/$filename"
# Handle filename conflicts
counter=1
while [ -f "$dest" ]; do
base="${filename%.*}"
ext="${filename##*.}"
if [ "$base" = "$ext" ]; then
# File has no extension
dest="$target_dir/${base}_${counter}"
else
# File has extension
dest="$target_dir/${base}_${counter}.${ext}"
fi
((counter++))
done
# Move the file
mv "$file" "$dest"
echo "Moved: $file -> $dest"
done
# Remove empty directories
find "$target_dir" -type d -mindepth 1 -empty -delete
echo "Directory structure flattened"

Замечания по безопасности

  • ⚠️ Эта операция модифицирует вашу файловую систему
  • 🔒 Рассмотрите создание бэкапа перед запуском
  • 📝 Просмотрите вывод чтобы увидеть какие файлы были перемещены
  • 🗑️ Пустые директории удаляются навсегда
[ ▲ 0 ]