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 ) 我担心信息可能会泄露,如果:
stat
输出中stat
上游代码(如果有)中都缺少它stat
( b ) 我想知道微软是否提供了任何类似的工具。
但实际上,任何获取信息的命令行方式都stat
可能提供(无论它是否涉及名为 的程序stat
),以及它提供的或多或少的特定于 NTFS 的信息的描述,都会引起人们的兴趣。
PS我在 Windows 7 上,但不要让这阻止你提到第一次为/在更高版本的 Windows 中提供的东西。
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
我刚刚拼凑了一个 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)
没有完全等效的命令,但使用 Windows 内置实用程序可以获得的最接近的fsutil
命令是使用命令。它将为您提供所提供的大部分内容stat
,以及有关底层文件系统结构的更详细信息。但不同的是stat
它需要在管理员权限下运行。您还可以使用wmic(或Get-WmiObject
(gwmi
别名)PowerShell 版本)获取大量有用数据。对于其他一些选项,您需要使用其他命令来获取
以下是如何获取与格式选项stat
类似的信息(在 PowerShell 中,如果有 cmd 版本),您可以使用这些信息来自定义输出。否则就转储fsutil file layout
,fsutil fsinfo sectorinfo
并fsutil fsinfo ntfsinfo
直接输出
访问权限:Windows 访问权限与 POSIX 访问权限有很大不同。因此,没有与%a类似的东西。但确实存在类似的信息
如果您想获得文件权限,请使用Get-Acl
或icacls
。在 Windows 中查看更多内容:在命令行中列出文件及其权限(访问)
如果您只想要文件模式,那么其中任何一个都足够并且最接近% A
(ls path\to\file).Mode
for %i in (path\to\file) do echo %~ai in cmd
Run Code Online (Sandbox Code Playgroud)
分配的块数 ( %b ):运行fsutil file layout path\to\file
orfsutil 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),则引用带解引用的文件名:
(ls path\to\file | ?{$_.LinkType} | select FullName,LinkType,Target
dir path\to\file
在 cmd 中,符号名称放在方括号中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)
文件时间:
(ls path\to\file).LastAccessTime
(ls path\to\file).LastAccessTime.Ticks
或(ls path\to\file).LastAccessTime.ToFileTime()
(取决于您想要的 Epoch:1/1/0001 或 1/1/1601)以 100ns 分辨率获取文件时间LastWriteTime
对于文件系统,通常您可以使用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
已被弃用,因此将来可能会被删除
您正在使用的工具使用的环境充当 Windows 和 Linux 之间的薄层,因此需要模拟某些部分以使 Linux 工具完成其任务。这解释了为什么存在一些捏造的信息(希望)在一致的情况下匹配。您必须查看实现它的环境的具体情况才能理解它。
另一方面,(对我来说)并不完全清楚你在寻找什么。正如您所说,有多种您不想使用的可用 API。这些“模拟”信息与您相关吗?
否则,您可能需要一系列工具来获取所需的所有信息。据我所知,访问权限和 ACL 在 NTFS 中根深蒂固。类似的工具icalcs
可以帮助您在命令行上获取有关访问权限的信息。要获取更深入的信息(部分信息),您可能需要考虑使用WMI,如该示例所示。PowerShell 中的简单dir
或get-childitem
可能会为您提供有关创建时间等的更多信息。我不知道有什么内置工具可以让您了解所有这些信息。您可能要做的就是使用有关 API 的信息并将它们包装在 PowerShell 脚本中。这可能接近您真正想做的事情。我不确定是否已经有一个脚本可以做到这一点。
归档时间: |
|
查看次数: |
11549 次 |
最近记录: |