Страница 1 из 1

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

Добавлено: Чт дек 24, 2015 23:50
Mellomann
Дано:
1. Total Commander 8.52a
2. AkelPad
3. Архив сканов в JPG (многие тысячи)
4. Imagine.wlx
5. ПрямыеРуки.ехе

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

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

Есть идеи чем можно воспользоваться или как это провернуть?
Гугл молчит, как партизан, но я не верю, что подобных задач не решали раньше...

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

Само собой, если комментарии использовались, файл с ними надо срезервировать.

Добавлено: Пт дек 25, 2015 00:49
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 и его СЦЕПИТЬ и ЛЕВСИМВ помогут...

Или есть решение без таких велосипедов на костылях?

Добавлено: Пт дек 25, 2015 00:54
Flasher

Добавлено: Пт дек 25, 2015 18:18
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

Добавлено: Вт мар 08, 2016 20:33
Моторокер
Если имена те же самые, можно все JPG переименовать в PNG и скопировать даты через плагин NSCOPY.

По уму бы конечно отдельный плагин сделать чисто для этого дела :)

Добавлено: Вт мар 08, 2016 23:31
Вахмурка

Добавлено: Ср апр 27, 2016 23:10
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
			}
        }
	}
}

Добавлено: Пн май 02, 2016 18:28
KatMuse
Flasher писал(а):А вообще не помешает пару скриптов непосредственно по теме:
А можно скрипт для копирования с сохранением даты, времени и всех прочих атрибутов.

Добавлено: Пн май 02, 2016 19:00
Flasher
KatMuse
Сперва в OFF заглянуть не мешало бы. Повторять оффтопный опыт, полагаю, не следовало. Ветка для копирования файлов/папок и так имеется.

Добавлено: Вт май 03, 2016 18:10
KatMuse
Ветка для копирования файлов/папок и так имеется.
Там спросить? Я посмотрел все 7 страниц (правда так и не понял зачем создавать копии или пустышки о_0), но в явном виде решения нет или я его пропустил?

Добавлено: Вт май 03, 2016 19:31
Flasher
KatMuse писал(а):Там спросить?
А что логика подсказывает? :wink:
KatMuse писал(а):правда так и не понял зачем создавать копии
>>
KatMuse писал(а):А можно скрипт для копирования с сохранением ...

Добавлено: Пт май 06, 2016 12:27
KatMuse
:)
Я имел ввиду копии или пустышки для файлов. Зачем, например, нужно сто копий одного файла или какие-то пустышки.

Добавлено: Пт май 06, 2016 17:45
Flasher
KatMuse
Для файлов или для папок. На выбор. Зачем и в каком случае создавать 100 копий одного файла, я понятия не имею, так же, как и одну копию сотни файлов. Этот опциональный выбор каждый сам делает. Тут на этом всё.