Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименовать группу файлов (http://forum.oszone.net/showthread.php?t=354040)

astiome 17-08-2023 19:47 3014091

Переименовать группу файлов
 
Добрый день!
Мне нужна помощь в переименовании файлов в папке.
Хочу упорядочить все имена фото и привести к общему знаменателю, на входе имею порядка 2 тысяч кадров

00100sPORTRAIT_00100_BURST20180828121607514_COVER.jpg
00000PORTRAIT_00000_BURST20181231130219048.jpg
IMG_20181231220815541_COVER.jpg

На выходе хочу получить
IMG_20161205_123633.jpg
(IMG_дата_время.jpg)

Есть кадры, с одинаковым датой и временем, не хочется ничего потерять в процессе переименования.
Подскажите, пожалуйста, код для автоматизации процесса.

DJ Mogarych 17-08-2023 23:26 3014107

Если в фотографиях есть метаданные, лучше переименовывать их по EXIF, например, с помощью
https://www.amok.am/en/freeware/amok_exif_sorter/

Serguei Kouzmine 18-08-2023 03:38 3014110

Цитата:

Цитата astiome
Подскажите, пожалуйста, код для автоматизации проце »

есть разница между "помогите доработать" и "сделайте за меня"

astiome 18-08-2023 11:53 3014125

Цитата:

Цитата DJ Mogarych
лучше переименовывать их по EXIF »

Спасибо огромное!
Это полностью решает мой вопрос!

megaloman 18-08-2023 13:20 3014136

vbs
Код:

BoxIn = "Z:\Box_In"            'Папка с файлами
FMask = "*.jpg"
RMask = "20\d{12}"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Reg = CreateObject("VBScript.RegExp")
Reg.Pattern = RMask

With CreateObject("Shell.Application")
    Set Fitems = .Namespace(BoxIn).Items
    Fitems.Filter 64 + 128, FMask

    For Each f In Fitems
        If RegMid(f.Name, Reg, Sout) Then
            With FSO
                .MoveFile f.Path, BoxIn + "\IMG_" + Mid(Sout, 1, 8) + "_" + Mid(Sout, 9, 6) + "." + .GetExtensionName(f.Name)
            End With
        End If
    Next
End With
'''''''''''''''''''''''''''''''''''''End Sub
Function RegMid(S, Reg, Sout)
    Sout = Empty: RegMid = Reg.Test(S)
    If RegMid Then Sout = Reg.Execute(S).Item(0)
End Function


YuS_2 18-08-2023 13:50 3014143

Цитата:

Цитата astiome
Хочу упорядочить все имена фото и привести к общему знаменателю, на входе имею порядка 2 тысяч кадров »

Мне хватало распределения файлов по каталогам:
Код:

# Создаются подкаталоги yyyy\MM, по дате съемки фото (EXIF) или по дате изменения
# файла, если данные EXIF отсутствуют.
# Файлы перемещаются в соответствующие датам каталоги.
# Обработка файлов производится c рекурсией
# При наличии дубликатов наименований файлов, производится добавление суффикса
# "_copy_N", N - номер копии
# Ничего не удаляется и проверки фото на идентичность, не производится
add-type -ass system.drawing
 
$tag = 0x9003 # Тег EXIF
$src = ".\1" # Исходный каталог, где расположены исходные файлы, можно указать абсолютный путь
$out = ".\OUT" # Целевой каталог, где формируется структура целевых файлов, лучше указать абсолютный путь
$flt = "*.jpg", "*.3gp", "*.mp4", "*.mpg", "*.png" # фильтр расширений файлов

dir $src -inc $flt -file -rec|%{
        $dtmp=$null
        # Ловушка для отсутствующих тегов EXIF:
        trap {continue}
        $arr = new-object system.drawing.bitmap($_.fullname)
        $dtmp = [text.encoding]::ascii.getstring($arr.getpropertyitem($tag).value)
        if($dtmp -eq $null -or $dtmp -match "0000"){
                $a = get-date($($_.lastwritetime)) -f "yyyy\\MM"
        } else {
                $date = $dtmp -replace '^(\d{4}):(\d{2}):(\d{2})','$1.$2.$3'
                $a = get-date($date) -f "yyyy\\MM"
        }
        $b = $out + '\' + $a
        if (!(test-path $b -pathtype container)){
                ni $b -type directory|out-null
        }
        $dir = gi $b
        # Освобождаем файлы:
        $arr.dispose()
        $dtmp.dispose()
        # Перемещаем файлы
        if (test-path $($dir.fullname+'\'+$_.name) -pathtype leaf){
                $cnt = 1
                $file = $dir.fullname+'\'+$_.basename+'_copy_'+$cnt+$_.extension
                while (test-path $file -pathtype leaf){
                        $cnt++
                        $file = $dir.fullname+'\'+$_.basename+'_copy_'+$cnt+$_.extension
                }
                # write-host $file -for cyan
                move $_.fullname $file
        } else {move $_.fullname $dir.fullname}
}

При желании, можно приспособить и для переименований...

Цитата:

Цитата astiome
Это полностью решает мой вопрос! »

Не на всех "картинках" могут присутствовать данные EXIF, в скрипте powershell это учтено...


Время: 23:57.

Время: 23:57.
© OSzone.net 2001-