본문 바로가기
컴퓨터/리눅스

리눅스의 find 명령

by adnoctum 2010. 5. 18.


find는 기본적으로 파일을 찾는 기능을 한다. find의 형식은 다음과 같다.

find [시작경로] [option]

많이 사용하는 옵션은 file 이름에 match되는 정규표현식을 지정해 주는 -name 이 있겠다. 이것을 사용하여 현재 경로와 현재 경로의 모든 하위 경로에서 test로 시작하고 txt 로 끝나는 모든 파일을 출력하고자 한다면 다음과 같이 하면 되겠다.


find . -name 'test*.txt'

만약 딱 현재 경로에서만 하고, 하위 경로로는 들어가고 싶지 않으면 검색의 깊이를 지정하는 maxdepth option을 사용하면 된다. 즉, find의 option 으로 준 경로가 depth 1 이다. 다음과 같다.


find . -maxdepth 1 -name 'test*.txt'


만약 파일 이름 중간에 test가 들어가는 모든 파일을, 하위 경로 2개까지만 포함해서 찾고 싶으면 다음과 같이 한다.

find . -maxdepth 2 -name '*test*'


내 홈 디렉토리에서, 2단계 까지 들어간 하위 경로에서, result_ 로 시작하고 txt 로 끝나는 모든 파일을 찾아서 지우고 싶으면 다음과 같이 한다.

find ~ -maxdepth 2 -name 'result_*.txt' -exec rm {} \;

차근차근 보면, 시작 경로를 ~ 를 사용했는데, 이것은 기본적으로 로그인한 사람의 홈 디렉토리를 의미한다. 또한, -exec option 은, 그 뒤에 있는 실행 파일을 실행시키는 역할을 한다. 이 때, -exec option 뒤에 온 명령어에 전달하는 파라미터 중 match된 파일 이름은 {} 로 접근하게 되며, 명령어가 끝나는 부분에서 \; 을 써주게 된다. 따라서 위와 같은 경우, 만약 ~/result_001.txt 가 match되었다면, rm ~/result_001.txt 가 실행되겠지. 만약 rm 에 -f option 을 넣어서 위처럼 하고자 한다면,

find ~ -maxdepth 2 -name 'result_*.txt' -exec rm {} -f \;

처럼 한다.


  find는 그 기능이 무궁무진하여 이 글 하나로 전부를 설명할 수는 없고, 내가 자주 사용하는 방식을 보면서 그 유용성을 엿본다. 

1. 특정 파일을 찾을 때

find . -name '*.cpp'

find를 실행하는 경로에서 시작해서 모든 하위 경로에서 파일의 확장자가 cpp 인 파일 이름을 출력한다. 

2. 특정 파일을 찾되, 지정된 깊이까지만 하위 경로를 검색할 때

find . -maxdepth 2 -name '*.cpp'

3. 파일 이름에 GSE3838 이 들어가는 파일 이름을 검색할 때

find . -name '*GSE3838*'

4. 파일 내부에 get_rank 라는 문자열이 들어 있는 파일을 찾아서 파일 이름을 출력할 때

find . -name '*.cpp' -exec egrep -H get_rank {} \;

이 명령구문은 두 가지 일을 하고 있는데, 우선 find option 에 적절한 파일 이름을 검색한다. 그 후 찾아진 파일 이름을 입력으로 하여 -exec 뒤의 구문을 실행한다. 위의 경우, *.cpp 파일을 찾은 후, 각 파일 이름에 대하여 egrep -H get_rank %찾아진 파일 이름% 형태의 명령을 하게 된다. 여기서 grep 을 설명하진 않는데, 위의 명령 구문은, 따라서, get_rank 가 포함된 cpp 파일을 찾아서 그 파일 이름을 출력하고 있다. 이 기능이 은근히 유용한데, 만약 파일 이름을 입력으로 받는 프로그램을 작성했고, 특정 경로 (와 하위 경로)에 포함된 파일들 각각에 대하여 그 프로그램을 실행시켜야 할 때 이와 같이 할 수 있는 것이다.


만약 한 파일에 여러 명령어를 차례로 대입하는 일을 find 로 찾아진 파일 각각에 적용하고자 한다면 다음과 같이 한다. 


find ./results/ -name '*.logrank_matrix.txt' -exec sh -c "head -n5 {} | wc -l" \;

초점은 -exec sh -c 이다.