파일처리_04 디렉터리에 있는 파일과 디렉터리 수 조사하기(find, wc)

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: find, wc
키워드: 파일 수, 디렉터리 수, 카운트
사용처: 작업 디렉터리 등 여러 파일이 있는 디렉터리에서 파일 수, 디렉터리 수를 세고 싶을 때

실행 예제

$ ./findcount.sh

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

스크립트

#!/bin/sh

targetdir="/home/user1/myapp/work"

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

dircount=$(expr $dircount - 1) # -------------------------------------- 2

echo "대상 디렉터리: $targetdir"
echo "파일 수: $filecount"
echo "디렉터리 수: $dircount"

   

해설

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

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

  • 대상 디렉터리 아래 구조

      ├── 20231110.log
      ├── 20231114.log
      ├── 20231119.log
      ├── backup
      │   ├── 20231109.log
      │   └── 20231112.log
      ├── calc
      └── script.tmp
    

파일로 20231110.log, 20231114.log, 20231119.log, script.tmp 라는 4개가 있고 backup, calc 라는 서브디렉터리가 있습니다. 또한, 서브디렉터리 [backup] 안에는 20231109.log, 20231112.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 메뉴 목록을 표시합니다.

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

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

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

find 명령어 마지막에 -print가 있습니다. 이것은 찾은 파일을 그대로 표시합니다. 아무것도 지정하지 않으면 -print라고 보기 때문에 -print는 생략할 수 있습니다. -print 외에도 -exec(명령어 실행), -ls(상세 정보를 포함해서 파일 목록 표시) 등이 있습니다. 자세한 사항은 man find로 확인하기 바랍니다.   2는 카운트한 디렉터리 수에서 1을 뺍니다. 이것은 find 명령어의 -type d로 디렉터리 목록을 표시하면 아래처럼 대상 경로가 먼저 표시되므로 실제 서브디렉터리 수보다 하나 더 많게 나오기 때문입니다.

  • find 명령어로 디렉터리 목록 표시

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

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