[Linux 셸 스크립트] 파일처리 - 026 디렉터리에 있는 파일과 디렉터리 수 조사하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 파일처리 - 026 디렉터리에 있는 파일과 디렉터리 수 조사하기

by 찬찬이 아빠 2021. 3. 17.
반응형
  1. 사용 명령어

(1) find

(2) wc

 

  2. 키워드 & 사용처

(1) 키워드

파일 수, 디렉터리 수, 카운트

 

(2) 사용처

작업 디렉터리 등 여러 파일이 있는 디렉터리에서 파일 수, 디렉터리 수를 세고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./findcount.sh

대상 디렉터리: /home/park/myapp/work
파일 수: 4
디렉터리 수: 2

 

 

  4. 스크립트

#!/bin/sh

 

targetdir="home/park/myapp/work"

 

filecount=$(find "$targetdir" -maxdepth 1 -type f -print | wc -l)       

dircount=$(find "$targetdir" -maxdepth 1 -type d -print | wc -l       

 

dircount=$(expr $dircount -1)             

 

echo "대상 디렉터리: $targetdir"

echo "파일 수: $filecount"

echo "디렉터리 수: $dircount"

 

 

  5. 해설

이 스크립트는 /home/park/myapp/work 디렉터리에 있는 파일 수와 디렉터리 수를 표시합니다. 지정한 디렉터리 바로 아래에 있는 파일만 세서 서브디렉터리에 있는 파일 수는 포함하지 않습니다.

 

이때 대상 디렉터리 /home/park/myapp/work에 있는 파일 목록은 다음과 같습니다.

a.log
b.log
c.log
d.log
backup(디렉터리)
  1.log
  2.log
calc(디렉터리)

 

파일로 a.log, b.log, c.log, d.log 라는 4개가 있고 backup, calc 라는 서브디렉터리가 있습니다. 또한, 서브디렉터리 [backup] 안에는 1.log, 2.log 라는 두 파일이 있습니다.

 

특정 디렉터리 아래의 파일 목록을 만들려면 find 명령어를 자주 사용합니다. find 명령어의 기본 사용법은 아래와 같습니다.

find [대상 경로] [서술식]

 

서술식으로 주로 -name과 -type을 씁니다. -name은 파일명을 지정하여 특정 패턴의 파일명을 찾을 때 사용합니다.

 

여기서 사용한 -type은 파일 종류를 지정합니다. -type으로 지정 가능한 종류는 아래와 같습니다. 이중 자주 쓰는 것은 -type d(디렉터리), -type f(일반 파일), -type l(심볼릭 링크)입니다.

서술식 지정 설명
-type b 블록 스페셜 파일
-type c 캐릭터 스페셜 파일
-type d 디렉터리
-type p FIFO(파이프)
-type f 일반 파일
-type l 심볼릭 링크
-type s 소켓
--menu 메뉴 목록 표시

 

에서는 -type f와 -type d로 각각 파일 목록과 디렉터리 목록을 표시하고, 그 줄 수를 wc 명령어의 -l 옵션으로 취득해서 셸 변수 filecount에 파일 수를, dircount에 디렉터리 수를 대입합니다.

 

①에서 find 명령어를 실행할 때 -maxdepth라는 옵션을 사용합니다. 이것은 서브디렉터리를 대상에서 제외하기 위함입니다.

 

find 명령어는 아무것도 지정하지 않으면 서브디렉터리도 포함해서 검색합니다. 이 예제에서는 디렉터리 /home/park/myapp/work 바로 아래에 있는 파일 수와 디렉터리를 카운트하므로 서브디렉터리는 포함하지 않습니다. 따라서 -maxdepth 1로 1단계만(즉 지정 디렉터리만) 대상으로 합니다.

 

find 명령어 마지막에 -print가 있습니다. 이것은 찾은 파일을 그대로 표시합니다. 아무것도 지정하지 않으면 -print라고 보기 때문에 -print는 생략할 수 있습니다. -print 외에도 -exec(명령어 실행), -ls(상세 정보를 포함해서 파일 목록 표시) 등이 있습니다.

 

는 카운트한 디렉터리 수에서 1을 뺍니다. 이것은 find 명령어의 -type d로 디렉터리 목록을 표시하면 아래처럼 대상 경로가 먼저 표시되므로 실제 서브디렉터리 수보다ㅏ 하나 더 많게 나오기 때문입니다.

$ find /home/park/myapp/work -type d -print
/home/park/myapp/work
/home/park/myapp/work/backup
/home/park/myapp/work/calc

 

대상 경로에 있는 디렉터리 수를 셀 때는 -type d 출력 결과에서 1을 빼야 합니다. 따라서 ②에서 expr 명령어를 써서 셸 변수 dircount에서 1을 빼고 그 결과를 명령어 치환 $()로 얻어 디렉터리 수를 셀 수 있습니다.

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글