【问题标题】:Display file name and creation time ONLY of all files in a directory tree仅显示目录树中所有文件的文件名和创建时间
【发布时间】:2012-08-08 23:57:16
【问题描述】:

主机:Win 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 选项的好处。

【问题讨论】:

    标签: shell directory cygwin dos


    【解决方案1】:

    这是一个繁琐的命令行原生解决方案,但它可以工作:-)

    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
    

    在批处理文件中跨多行格式化时看起来更好。

    @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.ddddddzzzz

    • YYYY = 年
    • MM = 月
    • DD = 天
    • hh = 24 小时格式的小时
    • mm = 分钟
    • ss = 秒
    • dddddd = 微秒
    • zzzz = 时区信息,表示为与 GMT 相差的分钟数

    【讨论】:

    • EDIT - 添加了跨目录按时间顺序排序的解决方案。一种解决方案使用 DIR,另一种使用 WMIC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2021-01-06
    • 2016-03-06
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多