Глава 23 · Часть IV · Реализуем SafeSort

Какие каталоги не нужно сканировать

Каталог результата и служебный каталог SafeSort исключены всегда — а символические ссылки не отслеживаются вовсе.

SafeSort · Часть 4 из 6Реализация
Downloads/
report.pdf — ✓ сканировать
images — ✓ сканировать/
Sorted — ✕ пропустить/
.git — ✕ пропустить/
.venv — ✕ пропустить/

Сканер SafeSort пропускает не только неважные файлы, но и целые каталоги — по двум разным причинам. Первая: некоторые каталоги заведомо не относятся к пользовательским файлам — например, .git или .venv. Вторая, более тонкая: собственный каталог результата, Sorted/, и служебный каталог самого SafeSort, .safesort/, должны быть исключены всегда — иначе повторный запуск начал бы сортировать уже отсортированные файлы и собственные журналы операций.

src/safesort/config.py
def excluded_names(self) -> frozenset[str]:
    return frozenset({*self.exclude, self.destination, STATE_DIRNAME})
Настраиваемые исключения и обязательные исключения — разные множества
self.exclude — список, который пользователь может изменить через файл настроек, который мы рассмотрим позже. Каталог результата (self.destination, по умолчанию Sorted) и служебный каталог .safesort добавляются в исключения динамически, при каждом вызове — их нельзя случайно убрать из списка исключений через настройки.

Символические ссылки: осознанно пропускаются

Символическая ссылка — файл или каталог, который на самом деле указывает на другое место в файловой системе. SafeSort не переходит по символическим ссылкам вообще, ни на файлы, ни на каталоги:

Почему ссылки пропускаютсяЧто произошло бы иначе
Ссылка может указывать за пределы просканированного каталогаSafeSort мог бы переместить файл, не принадлежащий выбранному каталогу
Ссылка на каталог может создать цикл обходаРекурсивное сканирование могло бы никогда не завершиться
Поведение с симлинками не всегда очевидно даже опытным пользователямПервая версия программы выбирает предсказуемое поведение вместо более сложного

Это решение легко проверить: сканер использует entry.is_symlink() раньше любой другой проверки и, если это символическая ссылка, сразу переходит к следующему элементу каталога — эта строка уже встречалась в _scan_dir() на предыдущей странице.

Практика: проверка исключённых каталогов
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →
Чекпойнт · Issue #1
git commit -m "feat: add directory scanner and configuration"
Слился как Pull Request #15. Та же ветка заодно принесла базовый модуль Config, на который позже опираются Issues #10 и #11 (страницы 23-20–23-22).
Статус в реальном Project: Done