Shell 仅显示目录树中所有文件的文件名和创建时间

Shell 仅显示目录树中所有文件的文件名和创建时间,shell,directory,cygwin,dos,Shell,Directory,Cygwin,Dos,主持人:赢7分 我有一个今天更新的产品(如果你愿意,可以打补丁)。我想具体看看哪些文件被添加到基本安装目录树中 预期结果将仅显示创建时间戳和完整文件路径/名称。我不想看到目录摘要信息或数据中的任何其他中断。输出将是一个非常直截了当的列表,如下所示: 08/06/2012 11:02 AM c:\my_product_install_path\folder3\new_file_3.xml 08/06/2012 11:01 AM c:\my_product_install_path\folder

主持人:赢7分

我有一个今天更新的产品(如果你愿意,可以打补丁)。我想具体看看哪些文件被添加到基本安装目录树中

预期结果将仅显示创建时间戳和完整文件路径/名称。我不想看到目录摘要信息或数据中的任何其他中断。输出将是一个非常直截了当的列表,如下所示:

08/06/2012  11:02 AM c:\my_product_install_path\folder3\new_file_3.xml
08/06/2012  11:01 AM c:\my_product_install_path\folder2\new_file_2.c
08/06/2012  11:01 AM c:\my_product_install_path\new_file_1.h
...
...
我认为,从完整安装目录树的这个自上而下的列表中,我可以通过向下滚动并查找时间早于X的第一个文件,轻松地从旧文件中看到新文件

如何在Windows命令shell(或cygwin shell)中执行此操作

“dir/s/b”非常接近,但不显示创建时间戳


您可能会认为“dir/s/b/T:C”会起作用,因为/T:C用于显示创建时间,但不是。/T:C选项不会“覆盖”/b选项以显示时间戳,因此,不知何故,我需要在添加时间戳的情况下获得/b选项的好处。

这是命令行的一个繁琐的本机解决方案,但它是有效的:-)

在批处理文件中跨多行格式化时,效果会更好

@echo off
for /d /r %%F in (.) do (
  pushd "%%F"
  for /f "eol= delims=" %%S in ('2^>nul dir /tc /a-d *') do (
    for /f "tokens=1-4*" %%A in ("%%S") do @echo %%A  %%B %%C  %%~fE
  )
  popd
)
您可能希望按逆时间顺序对列表进行排序,以便所有新文件都聚集在顶部。使用
DIR/ODN
选项在每个目录中按时间顺序排序是很简单的。但按时间顺序对所有目录进行排序是相当棘手的。这需要解析时间戳信息,并以允许SORT生成按时间顺序排列的列表的方式对其重新格式化。不幸的是,解析时间戳非常依赖于区域设置

下面是一个批处理解决方案,可与OP的区域设置一起使用。它首先按创建时间戳按时间顺序排序,然后按完整文件路径按字母顺序排序

@echo off
setlocal
set "tempFile=%temp%\listCreateTime%random%.txt"
>"%tempFile%" (
  for /d /r %%F in (.) do (
    pushd "%%F"
    for /f "eol= delims=" %%S in ('2^>nul dir /tc /a-d *') do (
      for /f "tokens=1-6* delims=/ " %%A in ("%%S") do (
        if "%%D"=="12:00" (
          echo %%C%%A%%B%%E00:00%%~fG*%%A/%%B/%%C  %%D %%E  %%~fG
        ) else (
          echo %%C%%A%%B%%E%%D%%~fG*%%A/%%B/%%C  %%D %%E  %%~fG
        )
      )
    )
    popd
  )
)
for /f "tokens=2 delims=*" %%A in ('sort /r "%tempFile%"') do echo %%A
del "%tempFile%"
也可以使用WMIC获取和排序信息。它要简单得多,因为时间戳的格式已经允许SORT按时间顺序进行排序,所以不需要解析。它也是独立于语言环境的-它应该可以在世界上任何支持WMIC的Windows机器上工作。但是这种方法速度较慢,输出也不容易读取。当然,可以添加额外的编码来解析时间戳中的子字符串,并将其重新格式化为更熟悉的形式

@echo off
setlocal disableDelayedExpansion
set "tempFile=%temp%\listCreateTime%random%.txt"
>"%tempFile%" (
  for /d /r %%F in (.) do (
    set "folder=%%~pnxF\"
    set "drive=%%~dF"
    setlocal enableDelayedExpansion
    2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, creationDate|findstr /brc:[0-9]
    endlocal
  )
)
sort /r "%tempFile%"
del "%tempFile%"
时间戳的格式为YYYYMMDDhhmmss.ddddzzz

  • YYYY=年
  • 毫米=月
  • DD=天
  • hh=24小时格式的小时数
  • 毫米=分钟
  • ss=秒
  • dddd=微秒
  • ZZZ=时区信息,表示为与格林尼治标准时间的分钟差

EDIT-添加了按时间顺序在目录中排序的解决方案。一个解决方案使用DIR,另一个使用WMIC。
@echo off
setlocal disableDelayedExpansion
set "tempFile=%temp%\listCreateTime%random%.txt"
>"%tempFile%" (
  for /d /r %%F in (.) do (
    set "folder=%%~pnxF\"
    set "drive=%%~dF"
    setlocal enableDelayedExpansion
    2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, creationDate|findstr /brc:[0-9]
    endlocal
  )
)
sort /r "%tempFile%"
del "%tempFile%"