
Windows エクスプローラーでは、通常ビューと検索ビューの両方で、ファイルの NTFS 圧縮状態を色分けできることは知っています。
NTFS レベルで圧縮または非圧縮されているファイルを具体的にフィルタリング/検索するにはどうすればよいですか?
できれば、Windows XP 以降で動作するソリューションが望ましいです (Vista 以降ではドライバーが提供されていないハードウェア デバイスが多数あります)。
Windows Search は 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 Search クエリは、単純なテキスト検索だけでなく、高度なプロパティ ベースのクエリ操作もサポートする高度なクエリ構文 (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
欠点が 1 つあります。出力は常にこの行で始まります。ここで # は [ディレクトリ名] です。
Recursive search of compact #.
そして次のような行で終わります:
Found # uncompressed files in # items examined.
それらの間の行には、圧縮されていないファイル名または圧縮されたファイル名への完全なパスが含まれています。
これは簡単に解析できます。
答え3
C
compact は固定された位置にを表示するため、
134217728 : 0 = 1.0 a 1 C BigFile.Dummy
123456789012345678901234567890123
= 33 番目の位置は、NTFS 圧縮されているかどうかを示します。
すべての圧縮ファイルは、33 番目の文字が C である compact によってリストされるため (少なくとも私が実行した場所ではそうであり、他の言語では異なる可能性があります)、次のコマンドが役立つ可能性があります。
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
を 2 倍にする必要がある%
ため、次のようになります (すべてを 1 つの大きな行に)。
(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 では圧縮されたフォルダーも表示されるため、これを回避するには、2 つの 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 に基づいているため、正規表現を OS のバージョンと言語に合わせて調整してください。
これは、結果リスト(読み取りが正常な 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
)
)
フォルダーを表示しないようにする秘訣は、個々のファイルごとに compact/findstr を呼び出すというコストをかけて、特定の FOR を使用して、;/A-D
上のファイル パラメーターのみを処理することです。FOR
また、これは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
また、(この世界のすべてのものと同様に) compact/findstr ペアのファイル名部分を切り取る (GNU for Windows から) 機能や、パスと結果を連結する ECHO 機能を使用することで改善することもできsed
ます。
これがタスクに役立つことを願っています。