我知道 Windows 资源管理器可以在常规视图和搜索视图中为文件的 NTFS 压缩状态着色。
如何具体过滤/搜索 NTFS 级别上压缩或未压缩的文件?
最好有一个适用于 Windows XP 及更高版本的解决方案(有相当多的硬件设备没有适用于 Vista 及更高版本的驱动程序)。
由于 Windows Search 占用的 CPU 太多,所以我也想要一个不占用 CPU 的解决方案。
答案1
命令行界面
Windows XP 不提供列出压缩文件的方法,甚至高级搜索方法也不是为此类任务而设计的。命令提示符可以解决这个问题:
cd /d "C:\Some folder"
compact | findstr /c:" 1 C"
该cd
命令仅用于导航到目标目录。当compact
不带参数运行该命令时,它将列出所有文件及其压缩详细信息(如果有)。然后可以通过将输出重定向到 来过滤输出findstr
。值得一提的是,即使在 Windows 2000 上,此方法也应该有效。
尽管如此,输出还是相当冗长的。要删除多余的信息,还需要做更多的工作:
for /f "tokens=9,*" %A in ('"compact | findstr /c:" 1 C" "') do @dir /b "%A*%B" 2>nul
上述命令将仅显示压缩文件名。该dir
命令将有助于验证文件名以避免误报(例如, 1 C
名称中包含字符串的文件名)。
您可以使用的其他参数包括:
/s
将命令应用到所有子文件夹。/a
显示隐藏文件或系统文件。
请注意,如果需要,这些参数必须同时用于compact
和命令。dir
要列出未压缩的文件,可以使用命令/v
的参数findstr
反转过滤器,并将值更改tokens
为8
(这是因为未压缩的文件没有C
标记,这会影响字符串标记化)。
进一步阅读
高级查询语法
Windows 搜索查询以高级查询语法 (AQS) 指定,它不仅支持简单的文本搜索,还提供基于高级属性的查询操作。
AQS 最初是在 Windows 桌面搜索中引入的,后来经过改进并集成到 Windows Vista 中,Windows 搜索。 你需要单独安装在早期的操作系统中。
以下查询将列出所有设置了存档属性且已压缩的文件。它适用于 Windows XP、Vista 和 7。它应该也适用于 Windows 8.x,尽管我没有测试过。
System.FileAttributes:(2080)
在英语区域设置中您还可以使用:
attributes:(2080)
以下是最有用的值的列表:
FILE_ATTRIBUTE_READONLY = 1
FILE_ATTRIBUTE_HIDDEN = 2
FILE_ATTRIBUTE_SYSTEM = 4
FILE_ATTRIBUTE_ARCHIVE = 32
FILE_ATTRIBUTE_COMPRESSED = 2048
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192
在上面的例子中,我结合了FILE_ATTRIBUTE_ARCHIVE
和FILE_ATTRIBUTE_COMPRESSED
:32 + 2048 = 2080
。
您可以使用逻辑OR
运算符搜索任意组合。例如,要搜索只读或非只读的压缩文件:
System.FileAttributes:(2080 OR 2081)
要反转搜索结果,您可以使用NOT
运算符:
System.FileAttributes:NOT(2080 OR 2081)
进一步阅读
答案2
和31415已发布适用于 Windows 资源管理器的出色解决方案至少在 Windows 7 及更高版本中可以运行(也许在 Vista 中可以运行,稍后将检查)。
因此,对于像 XP 和 2003 这样的旧版本 Windows,我研究了可以生成压缩或未压缩文件列表的命令行解决方案。
Compact
:很好,但输出很难解析
第一个想法是使用袖珍的,随 Windows 一起提供。
实际上它可以列出文件(当参数包含空格时,用双引号引起来):
compact [filemask] /a /s:[directoryname]
这种格式对于人类来说很容易阅读,但不容易解析。
FindCompressed 有一个错误,其长路径名会给出如下列表:
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlinit3.htm
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlpagenav.htm
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\html\imagessplash.jpg
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\imagestoolsbg.gif
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\scriptsunidata.js
因此,当名称太长时,它会剪切部分文件或目录。
# FindCompressed
:很好,输出的第一行/最后一行需要删除
Exodus Development 编写了命令行工具查找压缩。不带参数时查找压缩文件。带参数时-su
查找未压缩文件。[directoryname]
包含空格时请用双引号括起来。
FindCompressed.exe -su [目录名称]
FindCompressed
有一个缺点:它总是以此行开始输出,其中#是[directoryname]:
Recursive search of compact #.
最后以如下一行结尾:
Found # uncompressed files in # items examined.
这些行之间的行包含未压缩或压缩文件名的完整路径。
这很容易解析。
答案3
由于 compactC
在固定位置显示了:
134217728 : 0 = 1.0 a 1 C BigFile.Dummy
123456789012345678901234567890123
=第33位表示它是否是NTFS压缩。
由于所有压缩文件都以第 33 个字符为 C 进行压缩(至少在我运行它的地方是这样,其他语言可能有所不同),所以这个命令可能会有所帮助:
compact /A | findstr /R ^................................C
/R indicates that the following is a regular expression ^ is to indicate look from beggining of line The 32 dots for ignoring 32st charaters of the line Then the C to indicate must look for a C at the 33th position, that indicates it is NTFS compressed
它的作用是列出所有文件,然后通过查找C
从行首开始的第 33 个位置进行过滤。
如果想要递归,请使用 for 循环列出所有目录并在每个目录上运行该命令,如这个大示例命令(如果直接在命令行上输入):
(CD "C:\YourBaseDir\" && ECHO Listing NTFS compressed files and folders: && (compact /A /I | findstr /R ^................................C) && for /F "delims=" %a in ('DIR /AD/B/S') do @(CD "%a" && ECHO Listing NTFS compressed files and folders on: "%a" && (compact /A /I | findstr /R ^................................C)) & CD "C:\YourBaseDir\")
如果将命令放在 BATCH 文件中,则%a
必须将 加倍%
,因此必须像这样(全部在一行中):
(CD "C:\YourBaseDir\" && ECHO Listing NTFS compressed files and folders: && (compact /A /I | findstr /R ^................................C) && for /F "delims=" %%a in ('DIR /AD/B/S') do @(CD "%%a" && ECHO Listing NTFS compressed files and folders on: "%%a" && (compact /A /I | findstr /R ^................................C)) && CD "C:\YourBaseDir\")
或者为了更好地读取 BATCH 文件:
@ECHO OFF
CD "C:\YourBaseDir\"
ECHO Listing NTFS compressed files and folders:
compact /A /I | findstr /R ^................................C
for /F "delims=" %%a in ('DIR /AD/B/S') do @(
CD "%%a"
ECHO Listing NTFS compressed files and folders on: "%%a"
compact /A /I | findstr /R ^................................C
)
CD "C:\YourBaseDir\"
警告:Compact 也会显示压缩文件夹,为避免出现这种情况,需要重复执行。
结果是这样的:
Listing NTFS compressed files and folders:
0 : 0 = 1.0 a 1 C a
134217728 : 0 = 1.0 a 1 C BigFile.Dummy
Listing NTFS compressed files and folders on: "D:\Temp\a"
0 : 0 = 1.0 a 1 C b
134217728 : 0 = 1.0 a 1 C Other.Dummy
Listing NTFS compressed files and folders on: "D:\Temp\a\b"
134217728 : 0 = 1.0 a 1 C Another.Dummy
希望有所帮助,它基于允许正则表达式的 findstr,因此请根据您的操作系统版本和语言调整正则表达式。
这将用于在结果列表上仅显示文件(而不是文件夹)(在具有良好读取功能的 BATCH 文件内):
@ECHO OFF
CD "D:\YourBaseDir\"
ECHO Listing NTFS compressed files:
for /F "delims=" %%a in ('DIR /A-D/B') do @(
compact /A /I "%%a" | findstr /R ^................................C
)
for /F "delims=" %%a in ('DIR /AD/B/S') do @(
for /F "delims=" %%b in ('DIR /A-D/B "%%a"') do @(
ECHO Listing NTFS compressed files on: "%%a\"
compact /A /I "%%a\%%b" | findstr /R ^................................C
)
)
不显示文件夹的技巧是使用特定的 FOR 来仅处理;/A-D
上的文件参数,FOR
代价是为每个单独的文件调用 compact/findstr。
请注意,这一个不会CD
改变目录...它将要压缩的文件的完整路径作为参数传递...长路径警告!
结果如下(没有显示文件夹):
Listing NTFS compressed files:
134217728 : 0 = 1.0 a 1 C BigFile.Dummy
Listing NTFS compressed files on: "D:\Temp\a\"
134217728 : 0 = 1.0 a 1 C Other.Dummy
Listing NTFS compressed files on: "D:\Temp\a\b\"
134217728 : 0 = 1.0 a 1 C Another.Dummy
它还可以得到改进(就像这个世界上的所有事物一样),使用sed
(来自 GNU for windows)可以剪切 compact/findstr 对的文件名部分,也可以使用连接路径和结果的 ECHO sed
。
希望这可以帮助完成任务。