- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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을 빼고 그 결과를 명령어 치환 $()로 얻어 디렉터리 수를 셀 수 있습니다.