按创建日期排序后如何重命名多个文件?

How do I rename multiple files after sorting by creation date?

我想根据创建日期而不是旧文件名对文件进行编号。

示例:假设以下文件按创建日期的降序排列。

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

我正在使用从本网站的另一个 post 获得的以下代码(.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 文件。

感谢您的帮助。

在 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%"
    )

请注意,包含的示例中 none 以任何方式处理重复文件名的可能性。