디렉토리 내에서 전체 확장 유형 목록을 추출하는 방법은 무엇입니까?


28

디렉토리 내에서 그리고 하위 디렉토리 내에서 재귀 적으로 디렉토리 내 모든 디렉토리가 처리된다는 것을 의미합니다. 디렉토리 내에서 고유 한 확장자의 전체 목록을 어떻게 컴파일합니까?

OS는 모든 최신 업데이트가 포함 된 Windows XP이지만 실제로 무엇을하고 있는지 알 수 있으면 스크립트를 실행해도 괜찮습니다.하지만 실제로는 닷넷을 설치하지 않아도되기를 선호합니다.

답변:


29

이 배치 스크립트가이를 수행합니다.

@echo off

set target=%~1
if "%target%"=="" set target=%cd%

setlocal EnableDelayedExpansion

set LF=^


rem Previous two lines deliberately left blank for LF to work.

for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
    set ext=%%~xi
    if "!ext!"=="" set ext=FileWithNoExtension
    echo !extlist! | find "!ext!:" > nul
    if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)

echo %extlist::=!LF!%

endlocal

.bat파일을 파일 로 저장 하고 명령을 사용하여 파일 batchfile이름을 바꾸고 현재 디렉토리를 나열하거나로 경로를 지정하십시오 batchfile "path". 모든 하위 디렉토리를 검색합니다.

파일로 내보내려면 batchfile >filename.txt(또는 batchfile "path" >filename.txt)를 사용하십시오.

설명

for /f...줄 앞의 모든 것이 설정됩니다. 검색 할 대상 디렉토리를 가져오고 지연된 확장 을 활성화 하여 루프에서 변수를 업데이트 하고 더 깔끔한 출력에 사용할 수 있는 줄 바꿈 ( LF)정의합니다 . 아, 그리고 %~1의미는 인용 부호를 두 배로 막는 "첫 번째 인수를 받아 따옴표를 제거하십시오" 라는 의미 for /?입니다.

루프는 해당 dir /b /s /a:-d "%target%"명령을 사용 하여 대상 아래의 모든 하위 디렉토리에있는 모든 파일 목록을 가져옵니다.

%%~xidir명령이 반환 하는 전체 경로에서 확장명을 추출 합니다.

빈 확장명은 "FileWithNoExtension"으로 바뀌므로 이러한 파일이 있다는 것을 알 수 있습니다. 빈 줄을 대신 추가하면 그다지 명확하지 않습니다.

find고유성을 보장하기 위해 명령을 통해 전송 된 경우 전체 현재 목록 입니다. find 명령의 텍스트 출력은 nul기본적으로 블랙홀로 보내집니다 – 우리는 원하지 않습니다. 우리는 항상 :목록의 끝에 a 를 추가하기 때문에 검색 쿼리가 :부분 결과와 일치하지 않도록 검색 질의로 끝나야합니다 ( 주석 참조).

% ERRORLEVEL %은 find명령에 의해 설정되며 값 0은 일치하는 것을 나타냅니다. 따라서 0이 아닌 경우 현재 확장명은 지금까지 목록에 없으므로 추가해야합니다.

반향 줄은 기본적으로 출력되며 자리 표시 자 ( :)를 줄 바꿈으로 바꿔서 보기 좋게 만듭니다.


+1 @Bob : 놀라운 답변입니다. 설명을 추가하는 것도 큰 도움이되었습니다. 방금 스크립트를 테스트하고 테스트 결과를 검토했으며 모든 것이 잘 작동했습니다. 다시 한 번 감사합니다!
blunders

1
완벽하게 작동했습니다! 다음 구문을 사용했습니다.batchfile "path" >filename.txt
lucaferrario

대본! 그러나 그것으로 작은 버그가 있습니다 : 폴더에 파일을 포함하는 경우 aaa.csszzz.cs, 확장은 .cs스크립트에 의해보고되지 않습니다.
Goozak

1
@Goozak Whoops. 지금 수정했습니다. 텍스트 검색의 경이로움은 검색 쿼리가 :경계와 일치하도록 강제 종료해야했습니다 .
Bob

19

배치 스크립트의 요구 사항을 엄격하게 충족 시키지는 않지만 한 줄짜리 powershell 스크립트를 사용했습니다.

Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt

명령 행 / 배치 파일에서 잠재적으로 실행할 수 있습니다.

Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"

나는 그것을 인정하지 않으며 물론 Powershell을 설치해야합니다. 최신 버전의 Windows에서는이 문제를 해결할 수 없습니다.

제거 C:\MyDirectory하면 현재 디렉토리에서 실행됩니다.

결국 다음과 같은 것을 포함하는 FileExtensions.txt가 생성됩니다.

+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216  | .xml |
| 4854  | .png |
| 4378  | .dll |
| 3565  | .htm |
| ...   | ...  |
+-------+------+

폴더 구조에 따라 경로가 길다는 오류 메시지가 표시 될 수 있습니다.

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

하위 디렉토리도 파싱되지 않지만 다른 모든 결과는 계속 표시됩니다.


감사합니다. 유용한 답변입니다. 관련이없는 메모에서, 단일 답변 만 게시하고 100 일 연속 수퍼 유저를 방문 할 수있는 "Fanatic"배지가 있습니다. 사이트에 북마크가 있거나 있습니까?
blunders

이 배지는 2010 년에 효과적으로 숨겨지면서 수여되었지만 SO에 대해서는 훨씬 더 적극적입니다 : stackoverflow.com/users/31532/dan-atkinson . :)
Dan Atkinson

4

PowerShell을 사용하는 자세한 답변은 다음과 같습니다 (Windows XP의 경우 PowerShell을 설치해야 함).

스크립팅 가이! Windows PowerShell을 사용하여 파일 모음에 사용 된 고유 한 파일 확장명을 선택하려면 어떻게해야합니까?


1
PowerShell은 명령 줄보다 훨씬 쉽지만 .NET을 기반으로합니다. 안타깝게도 "닷넷을 설치할 필요가 없습니다"에 반대하는 것입니다.
Bob

1
+1 @RichardM : Bob과 동의하십시오. 또한 PowerShell에 대해 전혀 모르는 확장 인스턴스 수 계산과 관련된 코드는 메모리가 매우 많이 사용됩니다. 의미는 모든 인스턴스의 수를 유지하는 대신 각 확장에 대해 확장의 중복 인스턴스를 저장하는 배열을 만든 다음 끝에 각 확장 배열에 대한 수를 수행하는 것입니다. 확장 인스턴스를 계산합니다. 뭔가 빠졌습니까? (즉, 첫 번째 PowerShell one-liner가 좋으며 닷넷을 싫어하지 않으면 시도해 보았습니다.)
blunders

1
공정 해. 이 질문은 PowerShell 솔루션에 더 개방적인 검색자를 유도 할 수 있습니다. 괜찮은 Google 검색으로 위의 링크도 찾을 수 있습니다.
RichardM

3
이 링크의 +1 실수는 모든 .net을 싫어하지만, 위의 솔루션 이이 문제에 대한 최상의 장기 솔루션 이라는 것을 의미하지는 않습니다 . 언어가 많을수록 더 좋습니다.
Steve Rathbone

1
다음은 powershell을 사용하여 재귀 검색을 해결하는 또 다른 링크입니다. robertbigec.wordpress.com/2011/01/07/…
goodeye

0

사용중인 경로 아래 cmd의 모든 고유 확장명을 나열하려면 다음을 수행하십시오.

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"

0

나는 변경하는 것이 유용하다는 것을 알았다

if "!ext!"=="" set ext=FileWithNoExtension

if "!ext!"=="" set ext=.FileWithNoExtension

그리고 변경

echo %extlist::=!LF!%

echo %extlist::=!LF!% > ext-list.txt

생성 된 파일에는 (줄 바꿈은 없지만 상관 없음) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg가 포함되어 있습니다. .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb

프로젝트에 사용할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.