Пакетный перенос (копирование) даты файлов

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

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

Ответить
Аватара пользователя
Mellomann
Сообщения: 709
Зарегистрирован: Пн сен 07, 2009 00:44

Пакетный перенос (копирование) даты файлов

Сообщение Mellomann »

Дано:
1. Total Commander 8.52a
2. AkelPad
3. Архив сканов в JPG (многие тысячи)
4. Imagine.wlx
5. ПрямыеРуки.ехе

Задача:
Превратить JPG в PNG с сохранением исходной даты изменения/создания JPG файлов.
EXIFа нет, "переносить" нужно "modify timestamp" самих файлов.

Что нужно сделать:
PNG файлы уже есть, но с сегодняшним числом/датой, а куча жпегов датирована ещё с 2012 года и эти даты как-то перенести.

Есть идеи чем можно воспользоваться или как это провернуть?
Гугл молчит, как партизан, но я не верю, что подобных задач не решали раньше...
Аватара пользователя
Staniclaw
Сообщения: 533
Зарегистрирован: Вс дек 12, 2010 15:37
Откуда: Ташкент

Сообщение Staniclaw »

Можно запомнить дату в комментариях к файлам через диалог ''Изменение атрибутов''. После конвертации надо будет пройтись по файлу descript.ion поиском с заменой и исправить расширения с .JPG на .PNG. Затем вновь присвоить их файлам: тот же диалог ''Изменение атрибутов'', псевдоплагин tc, в поле ''Дата модификации'' вставить вот эту конструкцию: [=tc.Комментарий] -- вручную ''Тотал'' выбрать его не даст.

Само собой, если комментарии использовались, файл с ними надо срезервировать.
Вечному двигателю -- вечные тормоза!..
Аватара пользователя
Mellomann
Сообщения: 709
Зарегистрирован: Пн сен 07, 2009 00:44

Сообщение Mellomann »

Сейчас на скорую руку создал несколько текстовиков для теста.

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

test1.txt	1	24.12.15 22:22	-a--
test2.txt	1	24.12.15 23:34	-a--
test3.txt	1	24.12.15 22:22	-a--
и descript.ion (заменено "2" на "3"):

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

test3.txt 20151224 233410
На файл №3, который 22:22:22 нужно влепить 23:34 из коммента.

Результат:
http://savepic.su/6943030.png
http://savepic.su/6944054.png
ЧЯДНТ?

Добавлено спустя 7 минут:

М-да... поспешил ошибкой делиться...
Оказывается, в коммент сохраняемый штамп даты и формат его в установках - отличаются чуть более, чем полностью.
После правки descript.ion к такому виду

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

test3.txt 24.12.2015 23:34:10
и http://savepic.su/6943030.png прокатило!
Получил

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

test1.txt	1	24.12.15 22:22	-a--
test2.txt	1	24.12.15 23:34	-a--
test3.txt	1	24.12.15 23:34	-a--
что и требовалось!

Опробую, значит, на своих архивах, посмотрим, что из этого выйдет.
Жаль, придётся строки ещё чем-то обрабатывать... Но то ладно, чудо Excel и его СЦЕПИТЬ и ЛЕВСИМВ помогут...

Или есть решение без таких велосипедов на костылях?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

А вообще не помешает пару скриптов непосредственно по теме:

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

'======================= VBS =======================
' Замещение дат модификации выбранных файлов на даты
' модификации файлов с аналогичными базовыми именами

' Параметры: %WL <расширение одноимённых файлов> 
'===================================================
With WScript.Arguments
  C = .Count : If C = 0 Then WScript.Quit
  List = .Item(0) : Ext = .Item(1)
End With
Set ShA = CreateObject("Shell.Application")
With CreateObject("Scripting.FileSystemObject")
  Set File = .OpenTextFile(List,,,-1)
  Do : F = File.ReadLine
    Folder = .GetParentFolderName(F)
    Name = .GetBaseName(F) & "." & Ext
    If .FileExists(F) And .FileExists(Folder & "\" &_
    Name) And LCase(Ext) <> LCase(.GetExtensionName(F)) Then
      Set Folder = ShA.NameSpace(Folder)
      Folder.ParseName(.GetFileName(F)).ModifyDate =_
      Folder.ParseName(Name).ModifyDate
    End If
  Loop Until File.AtEndOfStream
End With

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

'=========================== VBS ===========================
' Замена дат создания и модификации выбранных файлов на даты
' создания и модификации файлов с аналогичным базовым именем
' Условие: требуется Script Helper ActiveX for TC by Volniy
' Параметры: %WL <расширение одноимённых файлов>
'===========================================================
With WScript.Arguments
  C = .Count : If C = 0 Then WScript.Quit
  List = .Item(0) : Ext = .Item(1)
End With
Set TCH = CreateObject("TCScript.Helper")
With CreateObject("Scripting.FileSystemObject")
  Set File = .OpenTextFile(List,,,-1)
  Do : F1 = File.ReadLine
    If .FileExists(F1) Then
      F2 = .GetParentFolderName(F1) & _
      "\" & .GetBaseName(F1) & "." & Ext
      If .FileExists(F2) And LCase(Ext) <> LCase(.GetExtensionName(F1)) Then
        With .GetFile(F2)
          TCH.SetFileDateAtr F1, .DateCreated, .DateLastModified
        End With
      End If
    End If
  Loop Until File.AtEndOfStream
End With
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

Сообщение Моторокер »

Если имена те же самые, можно все JPG переименовать в PNG и скопировать даты через плагин NSCOPY.

По уму бы конечно отдельный плагин сделать чисто для этого дела :)
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

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

Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
helb
Сообщения: 57
Зарегистрирован: Ср окт 08, 2014 21:46

Сообщение helb »

И еще один вариант на PowerShell. Работает с заменой в именах с помощью регулярных выражений и опционально заменой пути. Использую, например, для восстановления дат сконвертированных файлов (пример в шапке) или у сшитых панорамных изображений.

Запускать командой вида “powershell <имя.ps1> <параметры>”. PS должен быть установлен (актуально только для Win XP), и должно быть разрешено выполнение скриптов (единовременная команда “Set-ExecutionPolicy RemoteSigned” в среде PS)

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

<#	Fix timestamps by mask [by helb] v2015-12-07
	Takes filenames of files you need to fix from specified list, gets respective source filenames by replacing mask match (and optionally path) and restores timestamps from them.
	e.g. somefile1.png > somefile-stitched.png
	
	Command line usage: powershell <this script pathname> <listfile> -mask '<regexp of what to replace>' [-subst '<substitute text>'] [-mask2 '<>'] [-subst2 '<>'] [-pfrom """<path part to replace>""" -pto """<path substitute>"""]
	Example: powershell fix-timestamps-mask.ps1 %temp%\list.tmp -mask '\.m4a$|\.aac$' -srcmask '.mp3' -pfrom """B\:Sync\Converted\""" -pto """D:\"""
	Any ‘$’ characters in path should be escaped with ‘`’ (grave accent/back tick): “`$”
	Total Commander list parameter: %UL

	Берет имена файлов, которым требуется исправить даты, из указанного списка, получает имена соответствующих им исходных файлов заменой по маске (и опционально пути) и восстанавливает дату из них.
	Использование: powershell <путь скрипта> <файл-список> -mask '<regexp того что требуется заменить>' [-subst '<на что заменить>'] [-mask2 '<>'] [-subst2 '<>'] [-pfrom """<часть пути для замены>""" -pto """<на что заменить (путь)>"""]
	Любые символы «$» в пути требуется заменить на «`$»
	Параметр листа в TC: %UL
#>
Param
(
	[parameter(Position=0)][String[]]$list,
	[String[]]$mask,
	[String[]]$mask2,
	[String[]]$subst,
	[String[]]$subst2,
	[String[]]$pfrom,
	[String[]]$pto
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

function setTimestamp($path, $time) {
	$file = get-item -LiteralPath $path -force
	$ro = $file.IsReadOnly
	$file.IsReadOnly = $false
	$file.LastWriteTime = $time
	if ($ro) { $file.IsReadOnly = $true }
}

function msgBx($text, $title, $btns = 0) {
	return [System.Windows.Forms.MessageBox]::Show($text, $title, $btns)
}
#msgBx ($mask +" • "+ $srcmask +"`n"+ $pfrom +"`n"+ $pto +"`n"+ $list) "titl"

if (!$list) { msgBx "No list specified." "Error"; return }
if (!$mask) { msgBx "No mask specified." "Error"; return }

$list = [environment]::ExpandEnvironmentVariables($list)

if (!(test-path -literalPath $list)) { msgBx "List file not found." "Warning"; return }
else {
	(get-content $list | where-object { (test-path -literalPath $_) }) | foreach {
		if ($_ -match $mask) {
			if ($matches.count -gt 1) {
				$srcname = [string]([io.fileinfo]$_).name -replace $matches[1], $subst
			} else {
				$srcname = [string]([io.fileinfo]$_).name -replace $matches[0], $subst
			}
			if ($mask2 -and $srcname -match $mask2) {
				if ($matches.count -gt 1) {
					$srcname = $srcname -replace $matches[1], $subst2
				} else {
					$srcname = $srcname -replace $matches[0], $subst2
				}
			}
			$pathname = [string]([io.fileinfo]$_).directory + "\"
			if ($pfrom -and $pto) {
				$pathname = $pathname.replace($pfrom, $pto)
			}
			$srcname = $pathname + $srcname
			if (test-path -literalPath $srcname) {
				setTimestamp $_ (get-item -literalPath $srcname -force).LastWriteTime
			}
        }
	}
}
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

Flasher писал(а):А вообще не помешает пару скриптов непосредственно по теме:
А можно скрипт для копирования с сохранением даты, времени и всех прочих атрибутов.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KatMuse
Сперва в OFF заглянуть не мешало бы. Повторять оффтопный опыт, полагаю, не следовало. Ветка для копирования файлов/папок и так имеется.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

Ветка для копирования файлов/папок и так имеется.
Там спросить? Я посмотрел все 7 страниц (правда так и не понял зачем создавать копии или пустышки о_0), но в явном виде решения нет или я его пропустил?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KatMuse писал(а):Там спросить?
А что логика подсказывает? :wink:
KatMuse писал(а):правда так и не понял зачем создавать копии
>>
KatMuse писал(а):А можно скрипт для копирования с сохранением ...
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

:)
Я имел ввиду копии или пустышки для файлов. Зачем, например, нужно сто копий одного файла или какие-то пустышки.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KatMuse
Для файлов или для папок. На выбор. Зачем и в каком случае создавать 100 копий одного файла, я понятия не имею, так же, как и одну копию сотни файлов. Этот опциональный выбор каждый сам делает. Тут на этом всё.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить