명령줄 인터페이스

명령줄 인터페이스

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(고급 쿼리 구문)에 지정됩니다.

원천:Windows 검색 - 고급 쿼리 구문

AQS는 Windows 데스크톱 검색과 함께 처음 도입되었으며 나중에 다음과 같이 개선되어 Windows Vista에 통합되었습니다.윈도우 검색. 당신은따로 설치하세요이전 운영 체제에서는.

다음 쿼리는 아카이브 속성이 설정되어 있고 압축된 모든 파일을 나열합니다. 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_ARCHIVEFILE_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

C컴팩트는 고정된 위치에 표시되므로 :

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을 기반으로 하므로 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
 )
)

폴더를 표시하지 않는 방법은 특정 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또한 Compact/findstr 쌍의 파일 이름 부분을 잘라낼 수 있는 (Windows용 GNU에서) 경로와 결과를 연결하는 ECHO를 사용 하여 (이 세상의 모든 것과 마찬가지로) 개선될 수도 있습니다 sed.

이것이 작업에 도움이 되기를 바랍니다.

관련 정보