쿼카러버의 기술 블로그

Linux Shell Script - find (리눅스에서 파일, 디렉토리 찾는 법) 본문

Linux - Ubuntu/Shell Script

Linux Shell Script - find (리눅스에서 파일, 디렉토리 찾는 법)

quokkalover 2021. 7. 22. 18:34

타겟 :  find 명령어가 궁금하신 분들

 

읽는 법:

  • 당장의 커맨드가 궁금하신 분들은 Easy Command
  • 원리가 궁금한 분들은 find in detail까지 읽기

 

Easy Command

현재 디렉토리 하위에 존재하는 파일 중에 이름이 매칭되는 파일 찾는 법

find . -name '{파일 이름}'

$ find . -name '*.txt'

 

현재 디렉토리 하위에 존재하는 파일 중에 이름이 매칭되는 파일 찾는 법

find . -name {파일 이름}

$ find . -name lazy.txt

find in detail

 

리눅스를 쓰다보면

1) 파일/디렉토리를 찾거나

2) 특정 파일이 어떤 문구를 포함하고 있는지 확인하고 싶을 때가 있다. (해당 케이스는 아래 링크 참고)

 

https://etloveguitar.tistory.com/34

 

본 글은 1) 파일/디렉토리를 찾는 경우에 관한 글이다.

파일/디렉토리를 찾고자 할때는 보통 많이 쓰는게 find명령어다.

 

find 명령어는 파일 자체를 검색한다.

filedirectory.drawio
0.00MB

위와 같은 구조의 파일 디렉토리가 있다고 해보자.

 

richet의 home디렉토리는 lazy.txt 파일과 richet, baby 두 개의 하위 디렉토리를 가진다.

 

1) 현재 디렉토리 하위에 있는 모든 디렉토리를 찾는다.

home디렉토리에서 다음 명령어를 실행해보자.

$ find . -type d

출력은 다음과 같다.

 

2) 현재 디렉토리 하위에 있는 모든 파일을 찾는다.

home디렉토리에서 다음 명령어를 실행해보자.

$ find . -type f

출력은 다음과 같다.

 

3) maxdepth를 사용해서 검색의 깊이 제한

$ find . -maxdepth 1 -type f

 

4) mindepth를 사용해서 특정 깊이 아래만 검색

-mindepth 2는 2 이상 수준 이하의 모든 파일을 찾는다.

find . -mindepth 2 -type f

 

5) 이름 매칭하기

와일드 카드 * 사용

find . -name *.txt

위 처럼 실행 할 경우 에러가 발생한다.

원인은 * 에 잇는데, *같은 와일드카드 문자를 쉘이 명령문을 실행하기 전에 전개를 하고, 따라서 *.txt를 먼저 전개하면서 haha.txt가 된다.

근데 lazy.txt도 있기 때문에 오류발생..

그러면 어떻게 해야 할까?

아래처럼 하면 된다

find . -name '*.txt'

이렇게 하면 쉘이 *을 전개하지 못하면서 find 명령어는 *.txt 패턴을 얻게 된다.

 

파이프를 활용한 조합

 

1) 모든 파일의 행을 카운트 하기

$ wc -l $(find . -name '*.txt')

위 커맨드를 실행할 경우, 쉘은 젤 처음으로 $() 내부를 실행한다. 그리고 나서 $() 표현식을 명령어의 출력결과로 대채한다.

find의 출력결과가 4개의 파일이 될테고, 따라서 쉘은

wc -l haha.txt lazy.txt ./richet/auth.txt ./baby/lazy/txt

가 된다.

 

 

2) findgrep의 조합

find가 패턴이 매칭되는 파일을 찾고

grep이 또 다른 패턴과 매칭하는 파일 내부의 행을 찾는다.

아래의 커맨드를 실행할 경우 .txt 파일 중에 haha를 가지고 있는 파일과 해당 행을 찾아준다.

grep haha $(find . -name '*.txt')

 

 

참고 자료

http://statkclee.github.io/xwmooc-sc/novice/shell/06-find.html

Comments