如何按上次修改日期的目录顺序获取N个文件?

时间:2016-12-01 07:27:17

标签: powershell filesystems powershell-v2.0

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

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

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

  • 限制一些文件

  • 以降序排序

  • 不列出目录

感谢您的帮助!

4 个答案:

答案 0 :(得分:20)

  • 限制一些文件=>管道到Select-Object -first 10
  • 降序排序=>管道到Sort-Object LastWriteTime -Descending
  • 不列出目录=>管道到Where-Object { -not $_.PsIsContainer }

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

Get-ChildItem -Path 'D:\Temp' | 
    Where-Object { -not $_.PsIsContainer } |
    Sort-Object LastWriteTime -Descending |
    Select-Object -first 10 

答案 1 :(得分:2)

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

以下是结合Sort-ObjectSelect-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;} 

答案 2 :(得分:1)

这对我有用:

PS> dir | Sort-Object LastAccessTime 

它与bash命令几乎相同:

$ ls -ltr

要过滤目录:

PS> $mydir = dir | Sort-Object LastAccessTime
PS> $mydir | out-string -Stream | sls "^d" -NotMatch

(就我个人而言,我认为微软应该合并“ out-string -stream”和“ sls”以创建一个名为“ out-grep”的新命令,以便Powershell对于bash用户更正常地工作,而不会搞乱自定义Shell 。谁想键入所有垃圾内容只是grep命令输出?)

bash命令为:

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

答案 3 :(得分:1)

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

ls | sort LastAccessTime -Descending

这些只是这个的别名

Get-ChildItem | Sort-Object LastAccessTime -Descending