상세 컨텐츠

본문 제목

기준에 맞는 파일 개수 카운트 하기

MS Batch

by techbard 2022. 2. 6. 21:09

본문

반응형

Batch 파일로 작업을 할 때 정해진 기준에 맞는 파일이 몇 개인지 카운트할 필요가 있다. 이를 구현하는 방법을 기록을 남겨본다.

 

https://stackoverflow.com/questions/11004045/batch-file-counting-number-of-files-in-folder-and-storing-in-a-variable

 

batch file - counting number of files in folder and storing in a variable

I am very new to this. Please help me I was trying to write a batch file program to count number of files in a folder and assign that to a variable and display it to verify that it has been stored

stackoverflow.com

 

이미 스택오버플로우의 전문가들이 다양한 방법에 대해 설명을 해 놓았고 새로 발명할 것은 없다.

 

그 중에서 가장 간단하고 빠른 방법은 다음인데 설명을 해보겠다.

@echo off

set "EXT=txt"
set "cmd=dir /a-d-s-h /b .\*.%EXT% ^| find /c /v """
for /f "tokens=1 delims=" %%a in ('%cmd%') do (
	set "cnt=%%a"
)

echo file count = %cnt%
dir /a-d-s-h /b .\*.%EXT% 윈도우 명령 프롬프트의 dir 명령어의 옵션을 통해 원하는 파일 목록을 출력한다. %EXT%는 확장자로 조건을 줄 때 기존 코드를 손을 많이 대지 않고 윗 라인의 변수 지정 부분만 수정하기 위함이다.

dir의 옵션은 이미 dir /? 도움말로 확인이 가능하지만 여기에 쓰인 옵션은 다음의 의미를 가진다.

/a-d-s-h : 객체의 속성중에 디렉토리 제외, 시스템 제외, 히든 제외 후 나머지를 대상으로 한다.
/b : 객체를 출력할 때 간단한 형식으로 출력한다. 디폴트 형식으로 객체를 출력하면 온갖 정보들이 출력되어 원하는 개수 카운트를 하기 어렵다.

/s : 현재 폴더의 객체가 아닌 현재 폴더를 포함해 하위 폴더까지 결과를 출력하기 위해 사용한다.
^| dir로 출력한 객체 리스트를 | 파이프 뒤의 명령으로 넘긴다. find로 넘겨 발생한 결과로 볼 때 전체 출력이 한 번에 넘어 가는 것으로 보인다.

명령 프롬프트에서 직접 이 파이프 명령을 입력하는 경우에는 | 문자만 사용하면 되지만 배치 파일 내부에서 입력할 때는 특수문자라는 의미를 나타내기 위해 캐럿 문자 ^ 를 쓴다.
find /c /v "" 윈도우 명령 프롬프트의 내장 프로그램으로 사실 의미를 이해하기는 어렵다. 여러 설명이 있지만 그냥 외우는게 편하다.

find는 텍스트 파일에 원하는 스트링이 있는지 출력하는 용도지만 의미상 dir의 출력 결과를 find로 넘겨 find에서 처리한다.
set "cmd= 배치 파일 내부에서 명령 수행 결과를 변수로 받기 위해서는 for /f 문을 사용한다. for 문에서 in 뒤의 ()에 넣기 위해 ('%cmd%')를 사용한다. 마찬가지로 복잡한 for 문에 내용을 수정할 때 위의 set 라인만 수정하면 되므로 자주 사용한다.
set "cnt=%%a" for 문 안의 이 set 명령은 for 문이 수행된 이후 나온 결과를 %%a 변수에 넣고 이 %%a 변수는 for 문 안에서만 사용되고 사라지므로 for 문 이후에도 사용하기 위해 다시 새로운 변수인 cnt에 넣는다.
echo file count = %cnt% 특별할 것은 없는 마지막 결과 출력이다.

 

위의 스택오버플로우 링크에 다수의 방법을 설명하고 있는데 다른 방법을 쓸 필요는 없어 보인다.

 

하지만 참고로 다음과 같은 응용도 가능하다.

set "cmd=where /R . *.txt ^| find /c /v """
for /f "tokens=*" %%a in ('%cmd%') do (
	set "cnt=%%a"
)

echo file count = %cnt%

find 명령어에 파이프로 보내는 결과를 다른 식으로 구현해도 출력 결과가 동일하다면 같은 결과를 얻을 수 있다.

반응형

관련글 더보기

댓글 영역