Копирование фотографий с сортировкой по дате

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Hasami
Сообщения: 1
Зарегистрирован: Пн янв 18, 2010 01:44

Копирование фотографий с сортировкой по дате

Сообщение Hasami »

Здравствуйте!

Имеется простая задача: переместить все файлы с фотографиями с флешки в автоматически создаваемые папки на жестком диске с названием, сформированным из EXIF (в идеале) или хотя бы из даты создания файла (папки вида 2009-10-23).

Искал в гугле и на этом форуме, готового решения найти не удалось :( Буду очень рад любым подсказкам. Заранее спасибо!
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

А ещё была такая тема
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Tol!k
Если WDX-плагины возвращают дату не в виде текста (а они скорее всего так и делают), то моя утиль тут не поможет. Если же чел найдёт плагин, который возвращает дату именно в виде текста (строковой переменной), то тогда да, его задача может решиться без особых проблем. Но я, честно говоря, в этом сомневаюсь.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Samwatas
exif.wdx возвращает DateTimeStr

[offtop]
А в общем, мне утиль понравилась, её можно доработать добавив ещё один ключ командной строки - имя колонки, и чтобы он вывел только соответствующее значение, тогда это была бы законченная утилита со всем необходимым функционалом.
Я сейчас обдумываю концепцию новой утилиты, которая будет и читать и писать и выводить отладочную информацию и т.д.. В общем есть у меня парочка интересных идей, осталось их реализовать в коде.
Как продвигается работа?
[/offtop]
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

[offtop]
Обдумывание закончено, осталась сущая мелочь - реализовать 8) .
Я существо ленивое от природы, так что движется всё очень медленно, кроме того параллельно куча других дел (я ещё пытаюсь выучить на серъезном уровне английский - а на него желательно тратить как можно больше свободного времени, чтобы достичь заметных успехов), тем не менее, если есть интерес к утили, то попробую выделить и на неё немножко времени. А ещё лучше если я подарю свои идеи кому-нибудь из форумчан, у кого лучше знания в программировании, и есть больше свободного времени. Тогда готовую программу вы можете получить гораздо раньше. :wink:
[/offtop]
gre_vit
Сообщения: 2
Зарегистрирован: Вс янв 24, 2010 00:03
Откуда: Минск

Сообщение gre_vit »

Здравствуйте. Вопрос хороший, т.к. на сайте http://www.tckb.ru задача, даже с учетом всего-лишь даты создания файла, не решена полностью (в разделе автоматизации). Решил себя попытать в этом деле первый раз. Вот, что вышло при переделке скрипта:

Код: Выделить всё

If WScript.Arguments.Count = 0 Then
MsgBox "Не указаны параметры!", vbOKOnly + vbError, "Внимание!"
Wscript.Quit
End If

Dim TempFile, FSO, SelFile
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TempFile = FSO.OpenTextFile(WScript.Arguments(0), 1)

Dim FileName, FilePath, DashInName, NewFilePath, FileDateModif

Do While Not TempFile.AtEndOfStream
	Set SelFile = FSO.GetFile(TempFile.ReadLine)
	FileName = FSO.GetBaseName(SelFile)
	FileDateModif = Left(SelFile.DateLastModified, 10)
	FilePath = SelFile.ParentFolder
	If WScript.Arguments.Count > 1 Then
		NewFilePath = WScript.Arguments(1) & FileDateModif
	Else
		NewFilePath = FilePath & "\" & FileDateModif
	End If
	If Not FSO.FolderExists(NewFilePath) Then
		FSO.CreateFolder(NewFilePath)
	End If
	If Not FSO.FileExists(NewFilePath & "\" & FileName) Then
		FSO.MoveFile SelFile, NewFilePath & "\"
	Else
		MsgBox "Уже существует файл " & FileName & " в папке " & NewFilePath, vbOKOnly + vbExclamation, "Внимание!"
	End If
Loop

Set TempFile = Nothing
Set FSO = Nothing
Set SelFile = Nothing
Wscript.Quit
Работает. Главное, как указано, необходимо в параметры создаваемой кнопки прописать параметры %L "%T".
Ах да, в данном скрипте используется дата последнего изменения файла. Сделано для того, чтобы названия папок были датами создания.
gre_vit
Сообщения: 2
Зарегистрирован: Вс янв 24, 2010 00:03
Откуда: Минск

Сообщение gre_vit »

Вот и решил поставленный автором вопрос. Может и коряво, но все же. Решение реализовано на основе моего скрипта из предыдущего поста и примера с получением поля контекстного плагина с помощью wdxtest.exe.
Ну и плюс добавил, на всякий случай обработку, если отсутствует exif-информация в файле (не изображения) - берется дата последней модификации файла.

Кто будет пользоваться: поправьте для себя пути для exif-плагина и wdxtest.exe

Код: Выделить всё

if WScript.Arguments.Count = 0 Then
MsgBox "Не указаны параметры!", vbOKOnly + vbError, "Внимание!"
Wscript.Quit
End If

' определяем регулярное выражение для поиска
' даты снимка из exif данных: в плагине поле Date
Dim re
Set re = New RegExp
re.Global = True
re.IgnoreCase = True
re.MultiLine = False
re.Pattern = "4: Date: .*" ' 4-е поле, возвращаемое плагином

Dim TempFile, FSO, SelFile, wdxtest, wdxplug, WshShell, DateFolder, c, res, n_month, n_day, n_year
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
Set TempFile = FSO.OpenTextFile(WScript.Arguments(0), 1)

wdxtest="h:\PRG\TotalCommander\Scripts\wdxtest\wdxtest.exe"'путь к wdxtest.exe
wdxplug="h:\PRG\TotalCommander\Plugins\wdx\wdx_exif\Exif.wdx"'путь к Exif плагину

' основной цикл для перебора всех выделенных файлов и переданных в скрипт
Do While Not TempFile.AtEndOfStream
	Set SelFile = FSO.GetFile(TempFile.ReadLine) 'путь к файлу, инфу о котором получаем
' запускаем wdxtext.exe с соответствующими параметрами
   Set res = WshShell.Exec(wdxtest & " " & wdxplug & " " & SelFile)
   c = res.StdOut.ReadAll
   Set field=re.Execute(c)

	FileName = FSO.GetBaseName(SelFile)

' проверка на условие корректного ответа;
' при несоответствии файла критериям плагина (отсутствует EXIF-информация)
' плагин в каждое поле возвращает ошибку, которая начинается с символов --,
' тогда за имя создаваемого каталога берется дата последней модификации файла
' (обычно соотвествует дате создания) 
   If InStr(field(0).Value,"--")>0 Then
      DateFolder = Left(SelFile.DateLastModified, 10)
   Else
      DateFolder = Replace(Mid(field(0).Value,10,10),"/",".")
' приведение даты к виду dd.mm.yyyy
      n_year = Left(DateFolder,4)
      n_month = Mid(DateFolder,6,2)
      n_day = Right (DateFolder,2)
      DateFolder = n_day & "." & n_month & "." & n_year
   End If
	FilePath = SelFile.ParentFolder
	If WScript.Arguments.Count > 1 Then
		NewFilePath = WScript.Arguments(1) & DateFolder
	Else
		NewFilePath = FilePath & "\" & DateFolder
	End If
	If Not FSO.FolderExists(NewFilePath) Then
		FSO.CreateFolder(NewFilePath)
	End If
	If Not FSO.FileExists(NewFilePath & "\" & FileName) Then
		FSO.MoveFile SelFile, NewFilePath & "\"
	Else
		MsgBox "Уже существует файл " & FileName & " в папке " & NewFilePath, vbOKOnly + vbExclamation, "Внимание!"
	End If
Loop
В данном случае я использую 4-е поле Date контекстного плагина exif.wdx. Вообще можно переделать под любое поле с датой.
Достаточно в строке

Код: Выделить всё

re.Pattern = "4: Date: .*"
Поменять 4: Date: на название соответствующего поля. Сами поля, возвращаемые плагином (для примера) :

0: Width: 1024
1: Height: 768
2: Colordepth: -- ft_fieldempty: Field valid, but empty
3: DateTimeStr: '2008:11:30 22:12:17'
4: Date: 2008/11/30
5: Time: 22:12:17
6: DateOriginal: 2008/11/30
7: TimeOriginal: 22:12:17
8: DateDigitized: 2008/11/30
9: TimeDigitized: 22:12:17
10: ComponentsConfiguration: 'YCbCr'
11: CompressedBitsPerPixel: 5
12: ExifVersion: '0220'
13: ExposureBiasValue: 0
14: ExposureProgram: -- ft_fieldempty: Field valid, but empty
15: ExposureTimeFraction: '1/40'
16: ExposureTimeNr: 0.025
17: Flash: forced off
18: FNumber: 2.8
19: FocalLength: 5.8
20: ISO: 800
21: LightSource: -- ft_fieldempty: Field valid, but empty
22: Make: 'Canon'
23: ApertureValue: '2.8'
24: MaxApertureValue: '2.8'
25: MeteringMode: multi-segment
26: Model: 'Canon PowerShot A720 IS'
27: Orientation: Top left
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Многообещающая тулза
Renaming and/or Moving Files ^

By writing a new value to the FileName and/or Directory tags, files can be renamed and/or moved to different directories. This can be a very powerful tool in combination with the -d (date format) option for organizing images by date/time. For example, the following command renames all images in directory "DIR" according to the individual file's creation date in the form "yyyymmdd_HHMMSS.ext".
exiftool "-FileName<CreateDate" -d "%Y%m%d_%H%M%S.%%e" DIR

Or a new directory can be specified by setting the value of the Directory tag. For example, the following command moves all images originally in directory "DIR" into a directory hierarchy organized by year/month/day:
exiftool "-Directory<DateTimeOriginal" -d "%Y/%m/%d" DIR

Read here for more details about this powerful feature.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

xxcopy тоже может учитывать дату.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

Вахмурка
А там же вроде только текущая дата операции, а не дата создания файлов?
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

А я так и сказал - "учитывать". Вот еще об обработке даты/времени: создания, изменения, доступа.
Давеча была дискуссия тут (лень искать), где я дал аналогичную ссылку...
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Вахмурка писал(а):xxcopy тоже может учитывать дату.
Насколько я понял, тулза использует дату из EXIF снимка, а не из свойств файла.

Добавлено
Проверил, действительно из EXIF снимка:
Modify Date
Date/Time Original
Create Date

File Modification Date/Time – из свойств файла.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Hasami писал(а):переместить все файлы с фотографиями с флешки в автоматически создаваемые папки на жестком диске с названием, сформированным из EXIF ... (папки вида 2009-10-23).

Код: Выделить всё

TOTALCMD#BAR#DATA
%ComSpec% /c exiftool.exe
"-Directory<DateTimeOriginal" -d "%T%%Y-%%m-%%d" .
%commander_path%\wcmicons.dll,58
Рассортировать все снимки по исходной дате

1
-1
Ответить