Как стать автором
Обновить

Комментарии 22

А дописать хотя бы даты в exif распределённых пользователем файлов?

Так-то можно, но зачем? С прикладной точки зрения их видно по пути к файлу, хоть в gui, хоть в cli. Или речь о тех, для которых даты не были определены? Тогда откуда их взять? Время изменения или создания может очень отличаться от реального времени, когда был сделан снимок.

Я правильно понимаю, что если в системе установлен другой разделитель даты, "файл летит в хаос"? А если кто-то исправит машинально DirLenght на DirLength, то и директории сотрутся, рекурсивно?


Я бы очень советовал избегать вообще радикальных действий с файлами и директориями, особенно рекурсивно.


Смысл скрипта не очень понимаю — он даты файлов, собственно, игнорирует? А почему?
Да ещё и имевшуюся структуру папок сносит без спросу? То есть было папки "котики", "Юлины фото", "сканы документов", а он это все снесет и разложит по датам EXIF, уничтожив имевшиеся структуры?

Неправильно — утилита exiftool использует свои разделители, не привязанные к системным настройкам и возвращает строку. К datetime приведения нет.
Даты файлов игнорируются, т.к. задача — разложить именно по времени съёмки. Условно, рав сделан позавчера, обработан и сохранён в джпег сегодня, время создания файлов будет разным, но им логично быть в каталоге от одной даты, причём от даты съёмки, а не, например, последнего изменения.
Директории сотрутся рекурсивно, если суммарный размер целевой и всех вложенных равен нулю, т.е. каталог пуст.
Смысл скрипта как раз в том, чтобы избавиться от нескольких десятков папок «котики», «концерты», «попойки». Внутри условного «Юлины фото», можно организовать свою каталогизацию, при желании. Сканы документов пинать в фото(!)архив по крайней мере, странно, не находите?
Штука делалась фотографом для фотографа, с учётом специфики.
Предлагаете в «хаосе» воссоздать исходную структуру каталогов для нераспределённых?

Но если экзифа нет — почему не использовать дату файла вместо того, чтобы отправлять в хаос?


Я бы вообще не трогал файлы, если по атрибутам непонятно, что это. Иначе они из начального хаоса с возможной структурой складываются в новый хаос уже без структуры))


Понимаю, что у вас свой случай и задачи, но все же..

Потому что дата файла может очень, очень! отличаться от фактического положения вещей. В итоге вместо упорядоченной области можно получить тот же бардак, но ещё и неожиданный.
Не трогать — да, может быть это будет логичнее, тем более, что для этого достаточно убрать/закомментить одну строку.
>>Предлагаете в «хаосе» воссоздать исходную структуру каталогов для нераспределённых?
Предложил бы не только в «хаосе» так делать. Почему бы к имени папки, обозначающей номер дня, не приписать пару последних уровней исходных каталогов?
Например,
2019\08\21-фотосессия в парке
2019\08\21-детская площадка
и т.д.
В моём случае (тотального бардака) 90% этих приписок выглядело бы как 2019\08\21-101_0821 — бесполезно, некрасиво и нестандартно.
Возможно, для кого-то в этом будет резон.
Дата файла самая ненадёжная штука для определения даты снимка и почти наверняка не имеет к нему отношения.
По моему мнению все эти скрипты должны только применяться к каталогам «Разобрать!!!» и «New Folder (4)», а в вашем случае какая-то каталогизация уже выполнена.

На мой вкус, подобная каталогизация по датам вообще не имеет смысла. Если подходить к этому серьезно, надо
хотя бы анализировать дату И время, чтобы понимать "серии", и складывать по сериям.


А по хорошему надо ещё и нейросетью определять пейзажи, людей, котиков, цветы, детей, машины и ещё десяток типовых сюжетов. А если есть гео-тэг — ещё и добывать название места, где сделано фото.


Но что-то пока таких инструментов не нашел, и они далековато от скрипта автора..

По первому вопросу я так у себя и делаю: серию завожу если между снимками прошло больше 4 часов.
  1. -match в powershell регистронезависим. Регистрозависимый называется cmatch.
  2. Можно было обойтись списком и -contains
  3. Для отчленения разрешения [system.io.path]::****, хотя не уверен что на Мак он есть

Идея хорошая. Коду ближе к индусскому

О, какую больную тему затронули. Давно у меня зреет в загашниках такой пет-проект. Только вот долбаный перфекционизм не даёт начать с малого, как это сделали вы.
У меня к такой утилитке, похоже, гораздо больше требований, чем у вас.
Вот в ридмишке к проекту их можно глянуть.
Жалко времени на все эти завалы из пет-проектов не хватает.


Бесит каждый раз вручную раскладывать фотки из нескольких источников, а еще нужно думать об облачных бэкапах в гугле и яндексе, о том, что у меня хранятся и raw и jpeg, о том. что EXIF у них немного разные, о том, что куча сопутствующего хлама рядом валяется из брекетинговых и панорамных серий. Жалко же выбрасывать, "вдруг руки дойдут" (обычно не доходят). Иногда нащёлкаешь как из пулемёта десятки кадров одного сюжета с намерением потом выбрать ОДИН хороший, где никто не моргает, но потом просто забиваешь за неимением времени. Вот такие бы серии как-то группировать и прятать до хороших времен.

Друже, где ты был раньше? Эту задачу всегда решал вручную. Огромное, тебе, человеческое спасибо!
Использую тотал командер с его массовым переименованием через Ctrl+M.

Там уже есть и exif плагин, имя файлу можно задавать произвольно, при совпадении имен файлов(с разных фотиков бывает например P1003751.jpg) сделает приписку (1).
Есть откат последних действий(если накосячилось).
Как долго этот скрипт будет выполняться, разбирая папку с 80к файлов на слабеньком компе?
Вот уже двадцать минут вижу только это:

Каталог: D:\JPG
Mode LastWriteTime Length Name
— — — — d----- 12/2/2019 1:09 AM Ordered
d----- 12/2/2019 1:09 AM Chaos
Файлы разные бывают. На 60 гигов с седьмой альфы потребовалось минут 15.
Пара замечаний вот к этому коду:
$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")
}
Принимается, спасибо!
Про регистрозависимость — не в курсе, насколько это справедливо для мака, решил перестраховаться.
Поскольку у фотографий есть обязательный общий признак, дата создания

А теперь поднимите руку те, кто всегда устанавливал корректную дату и время в фотоаппарате после каждой замены батареек.
\o

Я в первую очередь удаляю дубликаты через ccleaner (побитно совпадающие, но в разных папках или с разными именами) и программами типа imagedupeless (похожие изображения). Второе простым скриптом не сделать.
И ещё у кого смертфоны или продвинутые фотоаппараты, по геотэгам (координатам мест) раскидывать снимки было бы удобнее, чтобы наблюдать за ростом свалок деревьев, зданий, карьеров и т.д.
Без автораспознавалки лиц — тоже грустно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации