Как переименовать несколько файлов после сортировки по дате создания?

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

Пример: предположим, что следующие файлы перечислены в порядке убывания даты создания.

A.jpg
D.jpg
B.jpg
C.jpg

Я хочу переименовать эти файлы так, чтобы

A.jpg becomes 4.jpg
D.jpg becomes 3.jpg
B.jpg becomes 2.jpg
C.jpg becomes 1.jpg

Я использую Windows 8 и отсортировал файлы в папке на основе даты создания. Однако, когда я пытаюсь переименовать файлы, DOS игнорирует сортировку и продолжает переименовывать файлы на основе старых имен файлов.

Таким образом,

A.jpg becomes 1.jpg
D.jpg becomes 4.jpg
B.jpg becomes 2.jpg
C.jpg becomes 3.jpg

Я использую следующий код (файл.bat), полученный из другого поста на этом сайте.

@Echo Off
setLocal EnableDelayedExpansion
set oldext=jpg
set newext=jpg
set index=0
for %%f IN (*.%oldext%) do (
    set /A index+=1
    set index=!index!
    ren "%%f" "!index!.%newext%"
)

У меня не установлено никаких скриптовых инструментов, и я создаю только базовые BAT-файлы с помощью блокнота.

Спасибо за вашу помощь.

1 ответ

Решение

В файловых системах FAT файлы не упорядочены, они размещаются так, как они включены в папки. В NTFS файлы расположены в алфавитном порядке. Вы можете изменить способ отображения файлов, но не физический порядок.

for циклы будут перебирать файлы в том же порядке, в котором они хранятся. Если вам нужно выполнить итерацию в другом порядке, вам нужно будет создать список в нужном вам порядке и выполнить итерацию по этому списку.

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "oldext=jpg"
    set "newext=jpg"
    set "index=0"

    for /f "delims=" %%a in ('dir /a-d /b /od "*.%oldext%"') do (
        set /a "index+=1"
        setlocal enabledelayedexpansion
        for %%b in (!index!) do endlocal & ren "%%~fa" "%%b.%newext%"
    )

Здесь dir Команда используется для вывода списка файлов в нужном порядке, а затем этот список повторяется for /f команда.

Внутренний setlocal enabledelayedexpansion / endlocal включен для обработки файлов с ! символы в его именах. Если вы знаете, что это никогда не будет вашим делом, вы можете напрямую использовать

@echo off
    setlocal enableextensions enabledelayedexpansion

    set "oldext=jpg"
    set "newext=jpg"
    set "index=0"

    for /f "delims=" %%a in ('dir /a-d /b /od "*.%oldext%"') do (
        set /a "index+=1"
        ren "%%~fa" "!index!.%newext%"
    )

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

Другие вопросы по тегам