Windows 相当于 unix 的“stat”命令?

Sam*_*amB 7 windows ntfs command-line stat

因此,我正在寻找一种命令行方法来获取文件的相对低级元数据的简短(ish)文本转储,与stat*nix 系统上的方式大致相同。

换句话说,无需实际读取文件内容即可通过 Win32 或 NT 文件 API 轻松获得信息,而且绝对无需靠近 Shell(如资源管理器和保存/打开对话框中所见,以及任何使用shell32.dll.

在 NTFS 上,此信息往往会存储在文件的 MFT 条目中,尽管我听说哪些属性最终会出现在正确的 MFT 中很大程度上取决于哪些属性适合,因为许多属性是可选的、可重复的,并且/ 或可变大小,有些可以,但也可以在 MFT 中使用多个插槽。(事实上​​,如果其他属性不占用太多空间,甚至可以将文件/目录的完整内容存储在 MFT 中!)所以,嗯,显然“出现在 MFT 中”不能用于实际定义我在找什么。

另外,我不是在寻找解析 NTFS 本身的工具,或者只在 NTFS 文件系统上工作:我只提到 NTFS 是因为,还有哪些其他本地 FS 将支持更多 NT 特定的东西?

具体来说,这是stat我用作路由器的 Debian 机器上的:

hydrogen% stat .
  File: ‘.’
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fe00h/65024d    Inode: 507974      Links: 4
Access: (0755/drwxr-xr-x)  Uid: ( 1000/ naesten)   Gid: ( 1000/ naesten)
Access: 2016-08-31 14:12:47.650440935 -0400
Modify: 2016-09-20 17:26:15.935591584 -0400
Change: 2016-09-20 17:26:15.935591584 -0400
 Birth: -
hydrogen%
Run Code Online (Sandbox Code Playgroud)

这是来自 Git for Windows 的一个:

下面“屏幕截图”的彩色光栅版本

Sam@Sam-laptop MINGW64 ~
$ git --version
git version 2.8.2.windows.1

Sam@Sam-laptop MINGW64 ~
$ stat .
  File: '.'
  Size: 0               Blocks: 32         IO Block: 65536  directory
Device: 147ac391h/343589777d    Inode: 1970324836977201  Links: 1
Access: (0755/drwxr-xr-x)  Uid: (197608/     Sam)   Gid: (197121/ UNKNOWN)
Access: 2016-09-18 18:32:28.072538600 -0400
Modify: 2016-09-18 18:32:28.072538600 -0400
Change: 2016-09-18 18:32:28.072538600 -0400
 Birth: 2014-08-21 18:52:08.217444400 -0400

Sam@Sam-laptop MINGW64 ~
$
Run Code Online (Sandbox Code Playgroud)

在这一点上,我说,“诞生”时间戳字段是Windowsism,但显然这不是正确的,因为Debian的统计显示领域,只是它上面,因为文件系统实际上并没有该字段为空。(这至少比“访问”时间戳清楚得多:两个系统都没有以传统strictatime方式更新它们。)

还要注意 Windows 端口是如何显示编造的文件访问权限,一个大得令人难以置信的“inode 号”,以及我只能假设的也是由 UID/GID 号组成的(因为 NT 如何使用可变长度的分层标识符而不是固定大小的数字来标识用户和组,并且不允许同时拥有用户和组所有权;也就是说,在 NT 上,文件由单个用户或组拥有,其他任何人都可以获得他们的权利来自 ACL)。

MS 是否提供这种工具,大概是显示更多实际信息和更少仙境信息的工具?


我的原文如下:

是的,我知道有 的端口stat,但是 ( a ) 我担心信息可能会泄露,如果:

  1. 它通常不会出现在 Unixstat输出中
  2. 无论stat上游代码(如果有)中都缺少它
  3. 搬运工要么
    1. 不要注意到 Windows 提供了信息
    2. 建立在不通过它的 POSIX 层上
    3. 不确定如何最好地呈现信息(或者这样做是否合适) stat
    4. 手上没有无限的时间

( b ) 我想知道微软是否提供了任何类似的工具。

但实际上,任何获取信息的命令行方式都stat可能提供(无论它是否涉及名为 的程序stat),以及它提供的或多或少的特定于 NTFS 的信息的描述,都会引起人们的兴趣。

PS我在 Windows 7 上,但不要让这阻止你提到第一次为/在更高版本的 Windows 中提供的东西。

bsh*_*ett 7

Get-Item /path/to/file | Format-List应该仅使用本机 Cmdlet 即可满足您的需求。

Get-Item获取有关您感兴趣的任何文件的详细信息。Format-List这会有些不直观地向 PowerShell 主机公开比其他方式更多的参数。正如您所期望的,它还将其格式化为列表。

 ~> Get-Item ./temp.txt | Format-List


    Directory: /Users/brianshacklett


Name           : temp.txt
Length         : 989
CreationTime   : 4/5/18 9:52:04 PM
LastWriteTime  : 4/5/18 9:52:04 PM
LastAccessTime : 6/26/18 7:58:18 PM
Mode           : ------
LinkType       :
Target         :
VersionInfo    : File:             /Users/brianshacklett/temp.txt
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:
Run Code Online (Sandbox Code Playgroud)

如果冗长的内容让您烦恼,您可以使用别名将其缩短为gi /path to file | fl


Ben*_*n N 6

我刚刚拼凑了一个 PowerShell 脚本。它几乎包含了对 Windows 有意义的所有内容,但访问控制除外,访问控制通常太大而无法概括。您可以使用该实用程序查看它们icacls

$obj = $args[0]
If ($obj.GetType().Name -eq 'String') {$obj = gi $obj}
'File: ' + $obj.FullName
'Size: ' + $obj.Length
$extents = [string](fsutil file queryextents "$($obj.FullName)")
If (-$extents.StartsWith('i')) {
  'Clusters: ' + ($extents.Substring(26) -split 'LCN')[0]
  'LCN: ' + $extents.Substring(42)
} Else {
  'Clusters: stored in file table'
}
'Attributes: ' + $obj.Attributes
$volumeinfo = (fsutil fsinfo volumeinfo "$([System.IO.Path]::GetPathRoot($obj.FullName)[0] + ':')")
$volumeinfo | ? {$_.StartsWith('Volume Serial')} | % {$_.Replace(' :', ':')}
$fileid = (fsutil file queryfileid "$($obj.FullName)")
'File ID: ' + $fileid.Substring(11)
$links = (fsutil hardlink list "$($obj.FullName)")
'Links: ' + ([string[]]$links).Length
'Owner: ' + $obj.GetAccessControl().Owner
''
'Access: ' + $obj.LastAccessTime
'Modify: ' + $obj.LastWriteTime
'Create: ' + $obj.CreationTime
'' # Extra blank line for readability
Run Code Online (Sandbox Code Playgroud)

它使用普通的 .NET/PowerShell 文件系统条目属性,并调用fsutil实用程序来处理棘手的事情。由于该实用程序不是 PowerShell cmdlet,因此我必须进行一些混乱的字符串切割才能获取正确的信息。

要使用它,请将其另存为文件并参阅PowerShell 标签 wiki.ps1的启用脚本部分。输出示例:

File: C:\Users\Ben\test\blank.ps1
Size: 8
Clusters: stored in file table
Attributes: Archive
Volume Serial Number: 0x9c67b42c
File ID: 0x0000000000000000000700000014428b
Links: 1
Owner: POWERSHELL\Ben

Access: 07/29/2016 20:01:25
Modify: 07/29/2016 20:02:43
Create: 07/29/2016 20:01:25
Run Code Online (Sandbox Code Playgroud)


phu*_*clv 6

没有完全等效的命令,但使用 Windows 内置实用程序可以获得的最接近的fsutil命令是使用命令。它将为您提供所提供的大部分内容stat,以及有关底层文件系统结构的更详细信息。但不同的是stat它需要在管理员权限下运行。您还可以使用wmic(或Get-WmiObjectgwmi别名)PowerShell 版本)获取大量有用数据。对于其他一些选项,您需要使用其他命令来获取

以下是如何获取与格式选项stat类似的信息(在 PowerShell 中,如果有 cmd 版本),您可以使用这些信息来自定义输出。否则就转储fsutil file layout,fsutil fsinfo sectorinfofsutil fsinfo ntfsinfo直接输出

  • 访问权限:Windows 访问权限与 POSIX 访问权限有很大不同。因此,没有与%a类似的东西。但确实存在类似的信息

  • 分配的块数 ( %b ):运行fsutil file layout path\to\fileorfsutil volume filelayout path\to\file并计算流中分配的簇总数$DATA

    例如,对于下面的输出,我们分配了 4 个区,每个区的簇长分别为 82、432.419、259 和 155.076。结果,分配的块数为 82 + 432419 + 259 + 155076 = 587836。一个快速技巧是将最后一个集群的 VCN 编号与其长度相加:432760 + 155076 = 587836

      Stream                  : 0x080  ::$DATA
          Attributes          : 0x00000000: *NONE*
          Flags               : 0x00000000: *NONE*
          Size                : 2.407.772.410
          Allocated Size      : 2.407.776.256
          Extents             : 4 Extents
                              : 1: VCN: 0 Clusters: 82 LCN: 1.620.482
                              : 2: VCN: 82 Clusters: 432.419 LCN: 5.331.392
                              : 3: VCN: 432.501 Clusters: 259 LCN: 3.230.067
                              : 4: VCN: 432.760 Clusters: 155.076 LCN: 9.299.239
    
    Run Code Online (Sandbox Code Playgroud)
  • %b ( %B )报告的每个块的大小(以字节为单位):

      fsutil fsinfo ntfsinfo <drive> | findstr /c:"Bytes Per Cluster"`
    
    Run Code Online (Sandbox Code Playgroud)
  • SELinux 安全上下文字符串 ( %C ):没有可比较的功能

  • 设备编号(%d%D):没有类似的对应项。但如果你想获取设备ID,可以使用以下命令

      (Get-WmiObject win32_volume | where { $_.driveletter -eq '<drive>' }).deviceid
    
    Run Code Online (Sandbox Code Playgroud)
  • 十六进制原始模式 ( %f ):没有等效形式。参见上面的%a/%A

  • 文件类型 ( %F ):没有直接等效项,因为 Windows 文件和驱动程序模型非常不同,并且 Windows 上没有字符设备之类的东西,因此您不会获得“字符特殊文件”。不过,通常您可以使用(ls path\to\file).Mode上面的 %A 来获取文件模式,并(ls path\to\file).LinkType获取链接类型

  • 所有者的组名 ( %G ):

      (Get-Acl file.ext).Group
    
    Run Code Online (Sandbox Code Playgroud)
  • 所有者的组 ID ( %g ):

      (gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl file.ext).Group)" }).SID
    
    Run Code Online (Sandbox Code Playgroud)
  • 硬链接数量(%h):没有类似信息。但是fsutil hardlink list path\to\file打印文件的所有硬链接,因此我们可以轻松地对它们进行计数

      (fsutil hardlink list path\to\file | Measure-Object).Count
    
    Run Code Online (Sandbox Code Playgroud)
    • 或者使用(fsutil file layout path\to\file | sls -CaseSensitive -Pattern '^Link.+\s+:\s+0x[0-9a-f]+:\s*HLINK Name\s+:' | Measure-Object).Count
  • 索引节点号 ( %i ):Windows 中没有索引节点,但 NTFS(可能还有 ReFS 等较新的文件系统)有一个等效的文件 ID,可以从fsutil file layout输出中提取或直接使用

      fsutil file queryfileid path\to\file
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件名(%n):这是很明显的

  • 如果是符号链接 (%N),则引用带解引用的文件名:

  • I/O 块大小 ( %o ):请参阅下面的文件系统的%s

  • 总大小,以字节为单位 ( %s ) (ls path\to\file).Length:。或者可以在cmd的dir输出中以及在上面的字段fsutil file layout path\to\file下的输出中轻松看到Size

  • 设备类型(%t%T):请参阅下面的%T了解文件系统类型

  • 所有者的用户名 ( %U ):

      (Get-Acl path\to\file).Owner
    
    Run Code Online (Sandbox Code Playgroud)
  • 所有者的用户 ID ( %u ):您可以使用以下命令获取用户 SID

      (gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl D:\zz.bat).owner)" }).SID
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件时间:

    • 上次访问时间 ( %x ):(ls path\to\file).LastAccessTime
    • 获取自 Epoch ( %X ) 以来的最后访问时间:(ls path\to\file).LastAccessTime.Ticks(ls path\to\file).LastAccessTime.ToFileTime()(取决于您想要的 Epoch:1/1/0001 或 1/1/1601)以 100ns 分辨率获取文件时间
    • 同样,可以使用以下命令检索上次修改时间(%y%Y )LastWriteTime
    • 获取上次元数据更改时间(%z%Z)比较棘​​手,您可能需要从 PowerShell 调用 win32 API

对于文件系统,通常您可以使用fsutil fsinfo ntfsinfo <drive>fsutil fsinfo sectorinfo <drive>来查找详细信息

  • 非超级用户可用的空闲块 ( %a ):无等效项。但我想你可以检查一下fsutil quota query

  • 文件系统中的总数据块(%b):

      fsutil fsinfo ntfsinfo <drive> | findstr /c:"Number Sectors"
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件系统中的文件节点总数 ( %c ):如果与 inode 数量有关,则 NTFS 以及许多较新的 Linux 文件系统(如 Btrfs 或 XFS)上没有 MFT 记录限制。MFT 文件大小将增加以存储更多文件记录。MFT记录总数可以通过以下方式查看fsutil fsinfo ntfsinfo <drive>

  • 文件系统中的可用文件节点 ( %d ):不确定这是什么。如果是关于未使用的索引节点的数量,那么如上所述,通常没有上限。可能fsutil volume allocationreport <drive>会起作用

  • 文件系统中的空闲块(%f):

    • fsutil fsinfo ntfsinfo <drive> | findstr /c:"Free Clusters"
    • 更详细的信息可以找到fsutil volume allocationreport <drive>
  • 十六进制文件系统 ID ( %i ):我不知道 Windows 上的确切同义词是什么,但这些可能会提供该信息

      fsutil fsinfo ntfsinfo <drive> | findstr /c:"Resource Manager Identifier" /c:"NTFS Volume Serial Number"
      (gwmi win32_volume | where { $_.driveletter -eq 'd:' }).serialnumber`
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件名的最大长度 ( %l ):

      (gwmi win32_volume | where { $_.driveletter -eq <drive>  }).maximumfilenamelength
    
    Run Code Online (Sandbox Code Playgroud)
  • 块大小(为了更快的传输)(%s):

      fsutil fsinfo sectorinfo <drive> | findstr /c:"Performance"
    
    Run Code Online (Sandbox Code Playgroud)
  • 基本块大小(对于块计数)(%S):

      fsutil fsinfo sectorinfo <drive> | sls physical
      fsutil fsinfo ntfsinfo <drive> | sls physical
      (gwmi win32_volume | where { $_.driveletter -eq 'd:' }).blocksize
    
    Run Code Online (Sandbox Code Playgroud)
  • 类型:对于%T,您可以使用fsutil fsinfo volumeinfo <drive> | findstr /c:"File System Name"。我不确定%t是什么,但这似乎是分区的神奇数字

上面的命令(Get-WmiObject win32_ALIAS | where { $_.FILTERFIELD -eq 'VALUE' }).GETFIELD可以改为wmic ALIAS where FILTERFIELD='VALUE' get GETFIELD /value. 但是wmic已被弃用,因此将来可能会被删除


Set*_*eth 0

您正在使用的工具使用的环境充当 Windows 和 Linux 之间的薄层,因此需要模拟某些部分以使 Linux 工具完成其任务。这解释了为什么存在一些捏造的信息(希望)在一致的情况下匹配。您必须查看实现它的环境的具体情况才能理解它。

另一方面,(对我来说)并不完全清楚你在寻找什么。正如您所说,有多种您不想使用的可用 API。这些“模拟”信息与您相关吗?

否则,您可能需要一系列工具来获取所需的所有信息。据我所知,访问权限和 ACL 在 NTFS 中根深蒂固。类似的工具icalcs可以帮助您在命令行上获取有关访问权限的信息。要获取更深入的信息(部分信息),您可能需要考虑使用WMI,如该示例所示。PowerShell 中的简单dirget-childitem可能会为您提供有关创建时间等的更多信息。我不知道有什么内置工具可以让您了解所有这些信息。您可能要做的就是使用有关 API 的信息并将它们包装在 PowerShell 脚本中。这可能接近您真正想做的事情。我不确定是否已经有一个脚本可以做到这一点。


归档时间:

查看次数:

11549 次

最近记录:

4 年,9 月 前