리눅스파일찾기,파일속문자열찾기
안녕하세요 오늘은 리눅스 안에서 파일 찾는 거 그러니까 파일 명으로 파일을 찾는 게 있구요
그 다음 파일 안에 있는 문자열 내용으로 파일을 찾는 게 있어요
이거를 한번 하나씩 알아보려고 합니다
기초적인 명령어에 해당되는 건데 여러분들이 알고 계시면 굉장히 유용하게 쓸 수 있는 명령어라고 볼 수가 있겠습니다
자 첫번째로 find라는 명령어입니다
일단은 명령어 file을 찾을 때 find라던지 혹은 locate라는 명령어를 쓸 수가 있는데요 먼저 한번 입력을 해보도록 할게요
일단 특정 키워드가 들어간 파일을 찾을 수가 있어요 예를 들어서 find라고 하고 나서 slash라고 하면 전체 폴더를 기준으로 얘기하게 되는 거구요
왜냐하면 이제 root 폴더라고 하는게 사실상 리눅스의 C드라이브 같은 존재이기 때문에 전체 폴더를 기준으로 해서 찾는데 여기다가 별을 붙였어요
그러니까 htop 이라고 하는 키워드가 뭔가 중간에 들어간 그런 파일 명칭을 찾는 겁니다
이거는 파일 내용 안에 있는 문자열을 찾는 게 아니라 파일명으로 찾는 거예요
그래서 이렇게 검색을 해주시게 되면 검색 결과가 나오게 되는데요
이때 우리가 여러가지 것들의 그 파일 명칭들을 기준으로 살펴볼 수가 있는데 이것이 좀 시간이 좀 꽤 걸릴 수가 있어요
왜냐하면 이제 전체 폴더를 기준으로 보는 것이기 때문에 그런데 여기 중간에 이런 permission denied 라든지 이런 문제의 상황처럼 오류 메시지가 같이 뜨는 것도 함께 볼 수 있습니다 그 이유는 아무래도 지금 현재 계정을 기준으로는 모든 폴더에 사실 권한이 있는 건 아니에요
그렇기 때문에 permission denied 권한 문제가 발생할 수 있겠고요
물론 sudo 를 붙일 수는 있겠지만 sudo 를 붙여서 한다고 하더라도 권한이 없는 파일들도 사실 존재합니다 특수 파일 같은 경우에는 특히나 그런데요 그런 경우들을 감안을 해서 현재 계정으로 permission denied 에러가 나거나 다양한 부분들을 제거하고 보고 싶다면 이런 식으로 2>/dev/null 붙여주시면 되기는 합니다 이렇게 붙여주는 의미를 한번 말씀드려보도록 할게요
이건 뭐냐면 프로그램들 모든 프로세스들은요 세 가지 파일을 사실 열고 있습니다
stdin, stdout, stderr라고 해서 세 가지 파일을 열고 있고요 file descriptor number 라고 하는 number에 따라서 이것들을 조정할 수 있는데요 0번, 1번, 2번이라고 지칭할 수가 있습니다 이 2번에 해당되는게 /dev/null 로 redirect한다는 의미가 결국엔 에러메시지가 출력되는 내용들을 생략하고 보지 않겠다 라고 하는 뜻으로 이해를 하실 수가 있는 겁니다
우리가 이 부분들에 대해서도 사실 얘기하자면 그 개념 정립해야 되는 것들이 많아요
그런데 여기서 모든 거를 말씀드리기에는 좀 한계점이 있고요 우리 리얼리눅스 강의 안에서 또 참고하실 수도 있습니다
그래서 나중에 기회가 되면 이것도 따로 한번 영상을 만들어봐도 참 좋을 것 같은데요
체계적으로 이런 개념들 그러니까 0번이든 1번이든 2번이든 파일 디스크립터 넘버가 뭐고, 파일 디스크립터가 뭐고 그리고 또 이렇게 redirect가 되는 원리, pipe가 되는 원리 이런 것들 까지도 다 공부를 하고 싶으시다면 리얼리눅스 강의에서 커널 중급A, B 혹은 시스템 핵심 정리 이런 수업들 참고하시면 많이 공부가 되실 거라고 생각이 듭니다
우선은 이렇게 말씀을 좀 드려봤구요
그 다음에 locate 보도록 하겠습니다 locate 같은 경우에는요 locate htop 이런 식으로 찾을 수가 있어요
아까보다는 속도가 훨씬 빠른 걸 볼 수 있겠고요 locate는 기본적으로 전체 폴더를 기준으로 찾는 것을 볼 수가 있습니다
하지만 locate는 약점이 있어요 어떤 약점이 있냐면 내부적으로 갖고 있는 데이터베이스를 기준으로 해서 찾는다는 점이 있습니다
새로운 파일이 만약에 바로 생성이 된다면 locate 같은 경우에는 그 파일을 못 찾아낼 수가 있어요
왜냐하면 내부적으로 사용하는 데이터베이스에 의해서 동작이 되는 것 때문이라고 말씀드릴 수 있겠고요
간단하게 실험으로 증명을 해본다면 내가 touch를 통해서 abcd.txt라는 파일을 새롭게 만들었어요 그리고 나서 이 파일을 locate라는 명령어를 통해서 찾잖아요 그러면 찾지 못하는 것을 볼 수가 있어요 그런데 find라는 명령어를 통해서는 abcd .txt라는 파일을 금방 찾는 것을 볼 수가 있습니다 find 같은 경우에는 데이터베이스 같은거 사용하지 않고 진짜로 찾는 거구요 그러다 보니까 좀 느려요
locate는 내부적인 데이터베이스를 써서 한다는 거죠 그래서 이거를 데이터베이스를 업데이트 시키면 되는 거 아닙니까?
맞습니다 업데이트를 시키면 돼요 updatedb 라는 명령으로 할 수 있는데 이것도 사실은 그 슈퍼유저 권한이 필요해요
그래서 이 부분이 권한 사실은 내부적으로 권한 문제인데 권한이 없어서 이 파일을 열지 못하는 거고 .db 라고 하는 데이터베이스 데이터 그 파일에 대한 리스트가 들어있는 데이터베이스 파일을 오픈하지 못한다는 에러로 이제 나타나게 되는 거죠
이 결과와 현상에만 집착할게 아니라 근본원인 root cause를 보게 되면 permission 문제입니다
그래서 여기서 sudo를 붙여주시게 되면 업데이트가 가능하겠구요 조금 시간 걸리죠
그 다음에 locate 를 하게 되면 이때는 검색이 되는 것을 보실 수가 있겠습니다
이런 식으로 해서 파일명을 찾는 find 라던지 locate 명령어를 한번 알아봤고요
특히 locate 같은 경우에는 간편하게 할 수 있지만 find 명령 같은 경우엔 옵션을 많이 넣을 수 있어요
예를 들어서 20M 이상 되는 파일을 찾고 싶다 (예: find <경로> -size +20M)
아니면 파일 타입만 찾고 싶다, 폴더 타입만 찾고 싶다 (예: find <경로> -type d)
여러가지 것들을 다양하게 지칭해서 검색할 수 있고 그러기 때문에 find 명령어가 굉장히 디테일하고 섬세하게 다양하게 이용될 수 있는 여지가 많습니다 그래서 그런 것들도 참고하시면 참 좋을 것 같구요 그 다음에 이제 grep과 ag를 통해서 파일 안에 있는 문자열로 찾는 것도 한번 알아볼까요?
자 문자열을 찾는 방법은 이겁니다. 여기서 grep으로 한번 찾아볼 건데요 grep 를 통해서요 nginx 라고 하는 키워드를 어느 폴더에서 etc 폴더에서 썼습니다
etc 폴더는 어떤 역할이죠? 설정 폴더입니다 설정 파일들이 많이 들어있는 그런 폴더에요
그 안에서 nginx 라는 키워드가 들어간 파일들을 쭉 찾는 겁니다 여기도 마찬가지로 error 메시지가 같이 출력되죠
권한이 없는 것은 그냥 무시하고 안 보겠다라고 한다면 이런 식으로 파일들을 찾을 수가 있겠구요
특정 파일 안에 있는 키워드를 우리가 찾을 수도 있습니다 여기 안에서 nginx 이런 키워드들이 들어있기 때문에 이제 파일을 찾아낼 수가 있는 거죠
그래서 문자열을 포함하고 있는 파일을 찾는 것과 파일명을 기준으로 찾는 것은 당연히 다른 거죠 그래서 이렇게 찾을 수가 있겠고요
여기서 제가 소개해드리고 싶은 것 중에 하나가 ag입니다
whatis ag라고 보시게 되면 silver searcher라고 이 그래프가 굉장히 유사한 프로그램이에요 근데 성능이 굉장히 좋습니다
패키지를 통해서 한번 찾아본다면 apt -cache search 를 통해서 silversearcher-ag 를 통해서 찾을 수가 있습니다
silversearcher-ag 라는 프로그램 패키지를 다운로드를 받아주시게 되면 이 그래프가 굉장히 유사한데 속도가 빨라요
그래서 특히 저 같은 경우는 리눅스 커널 소스코드 같은 거 안에서 뭔가 파일을 찾으려고 했을 때 이렇게 ag 를 굉장히 애용해서 씁니다
왜냐하면 리눅스 커널 소스코드가 굉장히 크거든요 소스 파일이 사실 텍스트 파일이지만 거의 1G가 넘어가고2G가 정도 되는 용량을 가지고 있습니다
아마 git 히스토리까지 합하면 3,4G 정도 될 텐데 그렇기 때문에 굉장히 이 파일들이 많아요 그래서 텍스트 파일들을 검색할 때 ag 를 쓰게 되는 성능이 굉장히 좋습니다
그래서 이런 식으로 한번 말씀을 드려봤구요
grep이나 ag도 regular expression 이라든지 다양한 옵션들을 가지고 있어요 그런 것들은 매뉴얼 페이지 같은 걸 통해서 man ag라든지 man grep 안에서 확인을 해보셔도 참 좋을 것 같구요
간단하게 한번 문자열을 통해서 파일을 찾는 방법에 대해서 말씀을 좀 드려봤습니다
그리고 아까 전에 했던 이 명령어들이 폴더뿐만 아니라 파일 안에서 그냥 바로 문자열을 찾으실 수도 있어요
그래서 그런 것들도 참고하고 이용해 보시면 좋을 것 같습니다
자 여기까지 해서 파일명을 찾는 것,그리고 파일 안에 있는 문자열의 내용으로 파일을 찾는 것 그래서 파일 검색 관련 글을 마무리 짓도록 하겠습니다 감사합니다
본 내용은 리얼리눅스 강의에서도 더 자세히 배우실 수 있습니다.
https://reallinux.co.kr/course/