Комментарии 22
А дописать хотя бы даты в exif распределённых пользователем файлов?
Я правильно понимаю, что если в системе установлен другой разделитель даты, "файл летит в хаос"? А если кто-то исправит машинально DirLenght на DirLength, то и директории сотрутся, рекурсивно?
Я бы очень советовал избегать вообще радикальных действий с файлами и директориями, особенно рекурсивно.
Смысл скрипта не очень понимаю — он даты файлов, собственно, игнорирует? А почему?
Да ещё и имевшуюся структуру папок сносит без спросу? То есть было папки "котики", "Юлины фото", "сканы документов", а он это все снесет и разложит по датам EXIF, уничтожив имевшиеся структуры?
Неправильно — утилита exiftool использует свои разделители, не привязанные к системным настройкам и возвращает строку. К datetime приведения нет.
Даты файлов игнорируются, т.к. задача — разложить именно по времени съёмки. Условно, рав сделан позавчера, обработан и сохранён в джпег сегодня, время создания файлов будет разным, но им логично быть в каталоге от одной даты, причём от даты съёмки, а не, например, последнего изменения.
Директории сотрутся рекурсивно, если суммарный размер целевой и всех вложенных равен нулю, т.е. каталог пуст.
Смысл скрипта как раз в том, чтобы избавиться от нескольких десятков папок «котики», «концерты», «попойки». Внутри условного «Юлины фото», можно организовать свою каталогизацию, при желании. Сканы документов пинать в фото(!)архив по крайней мере, странно, не находите?
Штука делалась фотографом для фотографа, с учётом специфики.
Предлагаете в «хаосе» воссоздать исходную структуру каталогов для нераспределённых?
Но если экзифа нет — почему не использовать дату файла вместо того, чтобы отправлять в хаос?
Я бы вообще не трогал файлы, если по атрибутам непонятно, что это. Иначе они из начального хаоса с возможной структурой складываются в новый хаос уже без структуры))
Понимаю, что у вас свой случай и задачи, но все же..
Предложил бы не только в «хаосе» так делать. Почему бы к имени папки, обозначающей номер дня, не приписать пару последних уровней исходных каталогов?
Например,
2019\08\21-фотосессия в парке
2019\08\21-детская площадка
и т.д.
По моему мнению все эти скрипты должны только применяться к каталогам «Разобрать!!!» и «New Folder (4)», а в вашем случае какая-то каталогизация уже выполнена.
На мой вкус, подобная каталогизация по датам вообще не имеет смысла. Если подходить к этому серьезно, надо
хотя бы анализировать дату И время, чтобы понимать "серии", и складывать по сериям.
А по хорошему надо ещё и нейросетью определять пейзажи, людей, котиков, цветы, детей, машины и ещё десяток типовых сюжетов. А если есть гео-тэг — ещё и добывать название места, где сделано фото.
Но что-то пока таких инструментов не нашел, и они далековато от скрипта автора..
- -match в powershell регистронезависим. Регистрозависимый называется cmatch.
- Можно было обойтись списком и -contains
- Для отчленения разрешения [system.io.path]::****, хотя не уверен что на Мак он есть
Идея хорошая. Коду ближе к индусскому
О, какую больную тему затронули. Давно у меня зреет в загашниках такой пет-проект. Только вот долбаный перфекционизм не даёт начать с малого, как это сделали вы.
У меня к такой утилитке, похоже, гораздо больше требований, чем у вас.
Вот в ридмишке к проекту их можно глянуть.
Жалко времени на все эти завалы из пет-проектов не хватает.
Бесит каждый раз вручную раскладывать фотки из нескольких источников, а еще нужно думать об облачных бэкапах в гугле и яндексе, о том, что у меня хранятся и raw и jpeg, о том. что EXIF у них немного разные, о том, что куча сопутствующего хлама рядом валяется из брекетинговых и панорамных серий. Жалко же выбрасывать, "вдруг руки дойдут" (обычно не доходят). Иногда нащёлкаешь как из пулемёта десятки кадров одного сюжета с намерением потом выбрать ОДИН хороший, где никто не моргает, но потом просто забиваешь за неимением времени. Вот такие бы серии как-то группировать и прятать до хороших времен.
Вот уже двадцать минут вижу только это:
Каталог: D:\JPG
Mode LastWriteTime Length Name
— — — — d----- 12/2/2019 1:09 AM Ordered
d----- 12/2/2019 1:09 AM Chaos
$ExtList = "arw,jpg,jpeg,NEF"
$FileList = Get-ChildItem $curDir -Recurse | `
Where-Object {(($ExtList.ToUpper() -match $_.Name.Split('.')[-1]) `
-or ($ExtList.ToLower() -match $_.Name.Split('.')[-1])) `
-and ($_.FullName -notmatch "Ordered")
}
1) У DirectoryInfo (объект, который возвращает Get-ChildItem) уже есть свойство Extension, соответственно нет нужды разбирать имя.
2) Операции сравнения в Powershell (т.е. -match, -eq и прочее) по-умолчанию игнорируют регистр, соответственно двойные проверки не нужны.
3) Вообще есть оператор -in, который проверяет наличие значения в списке.
В итоге этот код можно упростить примерно до такого:
$ExtList = '.arw','.jpg','.jpeg','.NEF'
$FileList = Get-ChildItem $curDir -Recurse | `
Where-Object { $_.Extension -in $ExtList`
-and ($_.FullName -notmatch "Ordered")
}
Поскольку у фотографий есть обязательный общий признак, дата создания
А теперь поднимите руку те, кто всегда устанавливал корректную дату и время в фотоаппарате после каждой замены батареек.
Я в первую очередь удаляю дубликаты через ccleaner (побитно совпадающие, но в разных папках или с разными именами) и программами типа imagedupeless (похожие изображения). Второе простым скриптом не сделать.
И ещё у кого смертфоны или продвинутые фотоаппараты, по геотэгам (координатам мест) раскидывать снимки было бы удобнее, чтобы наблюдать за ростом свалок деревьев, зданий, карьеров и т.д.
Без автораспознавалки лиц — тоже грустно.
Порядок в фотоархиве средствами powershell