![更改大量文件的创建时间以便按字母数字顺序排序的最简单方法是什么?](https://linux22.com/image/1362292/%E6%9B%B4%E6%94%B9%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%9B%E5%BB%BA%E6%97%B6%E9%97%B4%E4%BB%A5%E4%BE%BF%E6%8C%89%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97%E9%A1%BA%E5%BA%8F%E6%8E%92%E5%BA%8F%E7%9A%84%E6%9C%80%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我想让图像以特定顺序显示在尽可能多的智能手机上,而无需使用特定软件,最简单的方法是更改图像的创建时间,以便第一个文件的字母数字是最新的时间戳等等。这个过程可能需要一次处理数百张图像,所以我无法手动完成。有没有可以自动化这个过程的工具或方法?
答案1
尝试一下下面这个批处理文件。
它将显示匹配的文件以及新的时间戳信息,但不会(暂时)修改文件时间戳。
将批处理脚本保存为扩展名为.cmd
(例子:redatefiles.cmd
)。
它将处理当前(工作)文件夹中的所有文件。
您可以像这样运行它:
C:\>redatefiles.cmd
如果以此方式运行它,它将使用以下默认值:
- 当前文件夹中的文件扩展名为
.jpg
将被处理。所有其他文件将被跳过。 - 这日期(不是时间)匹配的文件按字母顺序将用作日期为所有匹配的文件生成时间戳。
- 这时间生成的时间戳(24 小时格式)将从
23:59:58
为了第一的匹配文件。
然后时间将减少2 秒对于每个文件,因此第二个匹配的文件将被加盖时间戳23:59:56
然后23:59:54
...23:59:00
,23:58:58
...23:00:00
,22:59:58
, 等等。
如果你想指定不同的文件掩码你可以像这样运行它:
C:\>redatefiles.cmd .png
or C:\>redatefiles.cmd *.png
or C:\>redatefiles.cmd "*.png"
您还可以指定多个文件掩码通过用|
像这样(需要双引号):
C:\>redatefiles.cmd ".png|.jpg"
or C:\>redatefiles.cmd "*.png|*.jpg"
or C:\>redatefiles.cmd "|.png|.jpg|"
or C:\>redatefiles.cmd "|*.png|*.jpg|"
如果要包含没有扩展名的文件,请使用单个.
(点)像这样:
C:\>redatefiles.cmd .
or C:\>redatefiles.cmd "."
or C:\>redatefiles.cmd ".|.png"
or C:\>redatefiles.cmd ".png|.|.jpg"
为了filemask
, 你不能:
- 指定姓名文件名的一部分,
- 指定除单个通配符之外的通配符
*
作为姓名文件名的一部分, - 在中指定通配符扩大文件名的一部分。
- 指定
*.*
作为filemask
例如,这些将不起作用:
C:\>redatefiles.cmd somefile.png
C:\>redatefiles.cmd somefile*.png
C:\>redatefiles.cmd ?.png
C:\>redatefiles.cmd *.pn*
C:\>redatefiles.cmd *.*
并且,如果文件的时间从00:00:02
到00:00:00
,下一个文件的时间为23:59:58
在同一天。这实际上限制了脚本在同一个文件夹中最多只能处理约 43200 个。
如果这些限制中的任何一个对您不起作用,请告诉我,我将编辑脚本以允许它。
配置:如果您查看批处理脚本的前几行,您将看到如下几行:
rem set "zzdate=01/01/2013"
rem set "zzhour24=23"
rem set "zzminute=59"
rem set "zzsecond=58"
如果要配置批处理脚本以使用不同的日期或者开始时间,您可以在此处通过删除rem
在每一行上提供您想要的值,如下所示:
set "zzdate=05/07/2013"
set "zzhour24=10"
set "zzminute=00"
set "zzsecond=00"
一旦您尝试过此操作并验证选择了正确的文件,并且根据需要处理了时间戳,请告诉我,我将添加代码以更改时间戳。
另外,请告诉我这是否正确:
- 您的位置使用美国日期格式
MM/DD/YYYY
喜欢04/30/2013
- 您需要设置
Creation time
对于文件而不是Modification time
(或者也许您需要同时设置两者)。 - 您已在计算机上安装或可以在计算机上安装 Microsoft Powershell。
这是批处理脚本。
@echo off
rem starting from 23:59:58, if there are 43200 files or more, it will not roll to previous day
call :clean
rem set "zzdate=01/01/2013"
rem set "zzhour24=23"
rem set "zzminute=59"
rem set "zzsecond=58"
rem *************************
set "zz_1=%~1"
set "zzdateready=0"
set "zztimeready=0"
call :getextlist
echo.
echo Re-dating files matching: "%zzextlist%"
echo.
for /f "usebackq delims=" %%f in (`dir /b /on "*.*"`) do call :work "%%~ff" "%%~nxf" "%%~xf"
goto :EOF
:work
rem:work
set "zz_full=%~1"
set "zz_name=%~2"
set "zz_ext=%~3"
if "%zz_ext%."=="." set "zz_ext=."
echo "%zzextlist%"|find /i "|%zz_ext%|">nul
if %errorlevel% NEQ 0 goto :noextmatch
rem got a target file
if not %zzdateready%%zztimeready% EQU 11 call :settimestamp
rem echo zzdate =%zzdate%
rem echo zzmonth=%zzmonth%/%zzday%/%zzyear%
rem echo zzhour24=%zzhour24%:%zzminute%:%zzsecond%
rem echo zzhour12=%zzhour12%:%zzminute%:%zzsecond% %zzampm%
rem echo zz_full=%zz_full%
rem echo zz_ext=%zz_ext%
echo new timestamp: %zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%) for file: %zz_name%
call :decrementtime
rem echo next timestamp=%zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%)
rem echo.
goto :EOF
:noextmatch
rem:noextmatch
echo Skipping file: %zz_name%
rem echo.
goto :EOF
:settimestamp
rem:settimestamp
if "%zzdate%."=="." call :getfiledate
if %zzdateready% EQU 0 call :explodedate
if "%zzhour24%."=="." call :setdefaulttime
if "%zzminute%."=="." call :setdefaulttime
if "%zzsecond%."=="." call :setdefaulttime
if %zztimeready% EQU 0 call :settime12
goto :EOF
:getfiledate
rem:getfiledate
for /f "usebackq delims=" %%g in (`dir "%zz_full%"^|find /i "%zz_name%"`) do set "zzdstring=%%~g"
set "zzdate=%zzdstring:~0,10%"
rem echo zzdstring=%zzdstring%
set "zzdstring="
goto :EOF
:explodedate
rem:explodedate
set "zzmonth=%zzdate:~0,2%"
set "zzday=%zzdate:~3,2%"
set "zzyear=%zzdate:~6,4%"
set "zzdateready=1"
goto :EOF
:setdefaulttime
rem:setdefaulttime
set "zzhour24=23"
set "zzminute=59"
set "zzsecond=58"
goto :EOF
:settime12
rem:settime12
rem insure 2 digit times
set "zzhour24=00%zzhour24%"
set "zzminute=00%zzminute%"
set "zzsecond=00%zzsecond%"
set "zzhour24=%zzhour24:~-2%"
set "zzminute=%zzminute:~-2%"
set "zzsecond=%zzsecond:~-2%"
set "zzampm=AM"
set "zzhour12=%zzhour24%"
if %zzhour12% GEQ 12 set "zzampm=PM"
if %zzhour12% GTR 12 set /A zzhour12=%zzhour24%-12
set "zzhour12=0%zzhour12%
set "zzhour12=%zzhour12:~-2%
if "%zzhour12%"=="00" set "zzhour12=12"
set "zztimeready=1"
goto :EOF
:decrementtime
rem:decrementtime
if 1%zzsecond% EQU 100 goto :fixseconds
set /a zzsecond=1%zzsecond%-2
set zzsecond=%zzsecond:~1%
goto :EOF
:fixseconds
rem:fixseconds
rem zzsecond is 00, set to 58, then check zzminute
set zzsecond=58
if 1%zzminute% EQU 100 goto :fixminutes
set /a zzminute=1%zzminute%-1
set zzminute=%zzminute:~1%
goto :EOF
:fixminutes
rem:fixminutes
rem zzminute is 00, set to 59, then check zzhourXX
set zzminute=59
if 1%zzhour24% EQU 100 goto :fixhours
set /a zzhour24=1%zzhour24%-1
set /a zzhour12=1%zzhour12%-1
set zzhour24=%zzhour24:~1%
set zzhour12=%zzhour12:~1%
rem if hour12 just went from 01:00:00 PM to 00:59:58 PM make it 12:59:58 PM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="00:59:58 PM" set "zzhour12=12"
rem if hour12 just went from 12:00:00 PM to 11:59:58 PM make it 11:59:58 AM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="11:59:58 PM" set "zzampm=AM"
rem if hour12 just went from 01:00:00 AM to 00:59:58 AM make it 12:59:58 AM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="00:59:58 AM" set "zzhour12=12"
rem if hour12 just went from 12:00:00 AM to 11:59:58 PM (previous day) it should be handled by :fixhours
goto :EOF
:fixhours
rem:fixhours
rem not adjusting date if hours rolls under 00
set "zzhour24=23"
set "zzminute=59"
set "zzsecond=58"
set "zzampm=AM"
set "zzhour12=%zzhour24%"
if %zzhour12% GEQ 12 set "zzampm=PM"
if %zzhour12% GTR 12 set /A zzhour12=%zzhour24%-12
set "zzhour12=0%zzhour12%
set "zzhour12=%zzhour12:~-2%
if "%zzhour12%"=="00" set "zzhour12=12"
goto :EOF
:getextlist
rem:getextlist
rem set default of "*.jpg"
set "zzextlist=|.jpg|"
set "zztext=x%zz_1%x"
if "%zztext%"=="xx" goto :EOF
set "zztext=%zztext:~1,-1%"
set "zztemp=%zztext:~0,1%"
if "%zztemp%"=="/" goto :EOF
set "zzextlist=%zztext%"
if "%zztemp%"=="|" set "zzextlist=%zztext:|*=|%"
if "%zztemp%"=="|" goto :EOF
set "zzextlist=|%zztext%|"
set "zzextlist=%zzextlist:|*=|%"
goto :EOF
:clean
rem:clean
set "zzextlist="
set "zzdate="
set "zzmonth="
set "zzday="
set "zzyear="
set "zzdstring="
set "zzhour24="
set "zzminute="
set "zzsecond="
set "zzhour12="
set "zzampm="
set "zzdateready="
set "zztimeready="
set "zz_full="
set "zz_name="
set "zz_ext="
set "zztemp="
set "zztext="
set "zz_1="
goto :EOF
编辑:
这是修改文件的代码Creation time
时间戳格式为US date
, 使用Microsoft Powershell
。
添加代码来修改文件Creation time
将时间戳添加到上面显示的批处理文件中:
1. 找到以下列内容开头的行:echo new timestamp...
。它看起来像这样:
echo new timestamp: %zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%) for file: %zz_name%
2. 在该行下方插入以下三行:
set "zzpsstamp12=%zzmonth%/%zzday%/%zzyear% %zzhour12%:%zzminute%:%zzsecond% %zzampm%"
set "zzpscmd=(dir \"%zz_full%\").CreationTime=\"%zzpsstamp12%\"
call powershell %zzpscmd%
如果这对您不起作用,请告诉我您的需求,我会为您编辑脚本。