
我知道 Windows 資源管理器可以在常規視圖和搜尋視圖中對檔案的 NTFS 壓縮狀態進行著色。
如何專門過濾/搜尋在 NTFS 層級壓縮或未壓縮的檔案?
最好是在 Windows XP 及更高版本中工作的解決方案(有相當多的硬體設備沒有適用於 Vista 及更高版本的驅動程式)。
由於 Windows 搜尋過於佔用 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。
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
有一個缺點:它總是以這一行開始輸出,其中#是[目錄名稱]:
Recursive search of compact #.
並以這樣的行結尾:
Found # uncompressed files in # items examined.
它們之間的行包含未壓縮或壓縮檔案名稱的完整路徑。
這很容易解析。
答案3
由於緊湊顯示 aC
在固定位置:
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\")
或者為了更好地閱讀批次文件:
@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 也會顯示壓縮資料夾,為了避免它們,需要使用 double for。
結果是這樣的:
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
它也可以使用(來自 Windows 的 GNU)來改進(就像這個世界上的所有事情一樣)sed
,讓我們剪切緊湊/findstr 對的文件名部分,並使用連接路徑和結果的 ECHO sed
。
希望這可以幫助完成任務。