【问题标题】:How to get N files in a directory order by last modified date?如何按最后修改日期按目录顺序获取 N 个文件?
【发布时间】:2017-04-15 17:57:51
【问题描述】:

我想在一个大目录中搜索一个或几个具有最新修改日期的文件。尝试一些 PowerShell 代码,但对我来说效果不佳。

Get-ChildItem 'D:\Temp' | Sort-Object LastWriteTime

我知道我可以使用-Recurse 在所有目录中进行搜索。但是如何:

  • 仅限制部分文件

  • 降序排列

  • 不列出目录

感谢您的帮助!

【问题讨论】:

    标签: powershell filesystems powershell-2.0


    【解决方案1】:
    • 只限制一些文件 => 管道到Select-Object -first 10
    • 以降序模式排序 => 管道到Sort-Object LastWriteTime -Descending
    • 不列出目录 => 管道到Where-Object { -not $_.PsIsContainer }

    因此要将它们组合在一起,这里有一个示例,它从D:\Temp 读取所有文件,按LastWriteTime 降序排序并仅选择前10 个:

    Get-ChildItem -Force -Recurse -File -Path "C:\Users" -ErrorAction SilentlyContinue | Where-Object { $_.CreationTime.Date -lt (Get-Date).Date } | Sort CreationTime -Descending | Select-Object -First 10 CreationTime,FullName | Format-Table -Wrap 
    

    【讨论】:

    • 感谢马丁的帮助。我有一个错误说 -File 找不到。有没有其他选择?
    • 我电脑里的PS版本是2.0
    • 这可能是因为您使用的是旧的 PowerShell 版本。要解决此问题,请将第一行替换为:Get-ChildItem -Path 'D:\Temp' | Where-Object { -not $_.PsIsContainer }。我在您的问题中添加了版本标签以澄清这一点。我还编辑了我的答案。
    • 可以通过将 -File 参数添加到 Get-ChildItem 来消除 Where-Object 过滤器。
    【解决方案2】:

    这对我有用:

    PS> dir | Sort-Object LastAccessTime 
    

    和bash命令差不多:

    $ ls -ltr
    

    过滤目录:

    PS> dir | Sort-Object LastAccessTime | Out-String -Stream | Select-String -NotMatch "^d"
    

    (我个人认为微软应该合并“out-string -stream”和“sls”来创建一个名为“out-grep”的新命令,以便powershell对bash用户更正常地工作,而不会弄乱你的shell . 谁想输入所有这些垃圾内容只是为了 grep 命令输出?)

    bash 命令是:

    $ ls -ltr | egrep -v "^d"
    

    【讨论】:

      【解决方案3】:

      我能写出的最简短最甜蜜的方式

      ls | sort LastAccessTime -Descending
      

      这些只是这个的别名

      Get-ChildItem | Sort-Object LastAccessTime -Descending
      

      【讨论】:

        【解决方案4】:

        Martin Brandl's answer 涵盖了原因,所以我不会重复,除了在较新的 Powershell 版本中,您可以使用Get-ChildItem -File 仅列出文件而不列出目录(文件夹)。我不知道它是什么时候引入的,但它在 Powershell 5.1 中

        这里有一些结合Sort-Object和Select-Object来限制和排序的例子

        按降序列出当前目录中最近访问的 5 个文件(不是目录)

        Get-ChildItem -File | Sort-Object -Property LastAccessTime -Descending | Select-Object -First 5
        

        最近访问的 5 个文件,当前目录,按升序排列

        Get-ChildItem -File | Sort-Object -Property LastAccessTime | Select-Object -Last 5
        

        列出5个最早访问的文件,当前目录,降序

        Get-ChildItem -File | Sort-Object -Property LastAccessTime -Descending | Select-Object -Last 5
        

        列出5个最早访问的文件,当前目录,升序

        Get-ChildItem -File | Sort-Object -Property LastAccessTime | Select-Object -First 5
        

        另请注意,您可以对一些日期时间文件属性进行排序。将它们全部获取为一个文件

        Get-ChildItem | Get-Member -MemberType Property | Where-Object -Property Definition -Like "datetime*"
        
           TypeName: System.IO.FileInfo
        
        Name              MemberType Definition                           
        ----              ---------- ----------                           
        CreationTime      Property   datetime CreationTime {get;set;}     
        CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}  
        LastAccessTime    Property   datetime LastAccessTime {get;set;}   
        LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
        LastWriteTime     Property   datetime LastWriteTime {get;set;}    
        LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;} 
        

        【讨论】:

        • 如果 N 是模糊的,还有一个更具交互性的选项,而不是管道到 Select-Object,管道到更多
        猜你喜欢
        • 2010-12-04
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多