Linux - locate & find

2021. 8. 10. 01:34Linux

저번 시간에는 일반 파일 내용을 검색하는 명령어를 배워보았습니다. 이번 시간에는 시스템에 있는 특정 파일들을 찾을 때 사용하는 명령어들을 알아보겠습니다.

 

1. locate : 리눅스에 저장되어 있는 파일 목록 DB를 참조해 파일을 찾아줍니다.

locate 명령을 사용하기 전에는 항상 DB를 업데이트 해줘야 최신 DB로부터 파일을 찾을 수 있습니다.

DB를 업데이트 시켜주는 명령어는 updatedb 입니다. root 관리자 권한으로 해야합니다

locate는 DB를 참조해서 파일을 찾기 때문에 속도가 매우 빠릅니다

 

 

S 옵션을 사용하면 DB를 확인 할 수 있습니다. 왜 DB를 업데이트 시켜야 하는지 확인 해 보겠습니다.

 

 

디렉터리와 파일 한개씩 생성후 다시 DB를 확인 해보았더니 변화가 없는것을 볼 수 있습니다. 이번에는 DB를 업데이트 후 DB를 확인 해 보겠습니다.

 

 

이번에는 수치가 바뀐것을 학인 할 수 있습니다. 근데 저희는 디렉터리 하나와 파일 하나를 생성했는데 DB에는 디렉터리 +1 파일 +2 된 것을 볼 수 있습니다. 

이는 디렉터리도 파일이기 때문에 두개다 +1 씩 늘어난 것입니다. 확인 한번 해보겠습니다.

 

 

디렉터리 하나 생성될때마다 디렉터리와 파일 수가 1개씩 늘어나는것을 확인 할 수 있었습니다. 사실 이건 그렇게 중요한것이 아닙니다. 다만 궁금하신 분들이 있을 까봐 적었습니다. 여기서 중요한것은 locate 는 DB를 참조해서 파일을 검색하고 locate를 사용하기 전에 DB를 업데이트 시켜야 원하는 결과를 얻을 수 있다는 것입니다. 

 

이제 실제로 한번 사용해 보겠습니다

파일명만으로 검색을 하면 예를 들어 zip만으로 검색을 하면 zip이라는 이름을 가진 파일만 찾는 것이 아니라 zip이 들어가는 모든 파일들을 다 검색합니다. 예) zipcloak, zipgrep 등

또한 찾을려고 하는 파일과는 무관한 많은 파일들을 찾아주기 때문에 검색 면에서 사용하기 매우 불편합니다.

wc -l  명령어를 사용하면 총 몇개가 있는지 확인 할 수 있습니다.

 

 

bin/zip 이런식으로 검색을 하게 되면 우선 bin 디렉터리를 찾은후 bin 디렉터리 내에서 다시 zip이라는 파일을 검색하기 때문에 파일명만 입력해서 찾는 방식보단 훨씬 간추려서 찾을 수 있습니다.

 

하지만 찾고자 하는 파일을 담고 있는 디렉터리명을 모르는 경우가 대부분이고 설사 안다고 해도 정확하게 찾기 힘듭니다. 그래서 사용하는 명령어가 find 입니다.

 

2. find : locate와는 달리 여러 방법으로 파일을 찾을 수 있습니다. 찾은 파일의 절대 경로를 알려줍니다.

find [경로] [옵션] [조건] [action] 

 

경로

~ : 홈디텍터리에 있는 모든 파일들로부터 찾습니다

/dev : /dev 디렉터리 하위에 있는 모든 파일들로부터 찾습니다

/ : 리눅스 시스템 전체에 있는 모든 파일들로부터 찾습니다.

 

find 명령어 다음에 경로만을 사용하면 해당 경로에 있는 모든 파일들을 찾아 출력합니다. 

경로를 안적고 빈 칸으로 두면 현재 위치에서 검색을 합니다.

 

 

옵션

-name : 입력한 이름을 가진 파일들을 찾습니다.

 

경로를 / 를 사용했기 때문에 리눅스 시스템에 있는 모든 파일들을 뒤져서 apple이라는 이름을 가진 파일들을 찾습니다.

locate와는 달리 입력한 파일명을 가진 파일들만을 찾습니다. 

 

지금 /run/user/1000/gvfs 허가 거부라는 오류가 계속 발생하는 것을 알 수 있습니다. 지금 사용중인 계정은 root 관리자 계정인데 왜 허가 거부라는 오류가 계속 발생하는 것일까요?

 

 

gvfs 디렉터리만이 ?로 표시되어 있는 것을 볼 수 있습니다. /run/user/1000 디렉터리는 user의 uid가 1000번인 keum 사용자의 소유입니다. 

 

 

그렇기 때문에 keum 사용자 계정으로 다시 접근 해보겠습니다.

 

 

이번에는 정상적으로 접근이 가능 한 것을 볼 수 있습니다. 도대체 gvfs는 무슨 디렉터리이길래 관리자의 접근을 막고 사용자만이 접근할 수 있는 것일까요?

 

GVFS(Gnome Virtual File System) : 그놈 가상 파일 시스템

Gnome : 그놈은 리눅스 계열의 데스크톱 환경을 의미합니다.

즉 gvfs는 리눅스 GUI 환경의 사용자 공간 가상 파일 시스템입니다. 이것의 정확한 존재 의의 보단 root는 액세스 할 수 없으며 사용자만 접근이 가능하다고만 알고 있으면 됩니다.

 

find 명령어로 / 위치에서 검색을 하려면 관리자 권한이 필요합니다. 사용자 계정으로 / 위치에서 검색을 하면 대부분의 파일들은 허가 거부 하기 때문입니다. 하집만 관리자 권한으로 검색을 하면 gvfs에 허가 거부 오류 메세지가 뜨기 때문에 신경 쓰입니다. 이를 해결 할 수 있는 방법은 두가지 있습니다. 

 

첫번째, 저희가 이미 배운 방법입니다. 리다이렉션을 사용하는 것입니다. 오류 출력을 화면이 아닌 /dev/null로 보내주면 라다이렉션에 대해 공부 하고 싶으신 분들은 다음 링크를 통해 공부하시면 됩니다.  리눅스 - 리다이렉션(redirection)

 

/dev/null : 이 파일은 항상 비어 있으며 이 파일로 전송되는 데이터는 버려집니다

 

두번째 방법은 -xdev 옵션을 사용하는 것입니다. 검색 위치 디렉터리의 파일시스템과 같은 파일시스템을 가지고 있는 파일들만 찾게 하는 옵션입니다. 검색 위치 디렉터리란 경로를 의미하는 것이며 find / -name zip 에서는  / 디렉터리를 의미하는 것입니다. 파일시스템을 확인 하는 방법은 무엇일까요? 이또한 저희가 전에 배웠던 명령어의 응용입니다. 바로 stat 입니다. 저희는 이 명령어로 파일의 정보를 자세히 볼 수 있다는 것을 배웠습니다.

 

 

하지만 파일시스템에 대한 정보는 없는 것을 볼 수 있습니다. 파일 시스템도 함께 학인 하려면 옵션 f 를 사용해야 합니다.

 

 

/ 디렉터리의 파일시스템은 xfs 라는 것을 알았습니다. -xdev를 사용하면 경로 디렉터리와 같은 파일시스템을 가진 파일들을 찾는다고 했습니다. 이번에는 파일과 디렉터리, gvfs 디렉터리의 파일시스템을 알아보겠습니다.

 

 

일반 파일과 디렉터리는 xfs, /run/user/uid/gvfs 디렉터리는 fuseblk 파일시스템을 가지고 있는 것을 확인 할 수 있습니다. 즉 find / -name zip을 하면 

/와 같은 파일시스템(xfs)를 가지고 있는 파일들만 검색하는 것입니다. gvfs는 다른 파일시스템을 가지고 있기 때문에 검색하지 않고 검색하지 않으니 오류 메세지도 사라진것입니다.

 

-user : 입력한 소유자를 가지고 있는 파일들을 찾습니다.

 

 

keum 사용자의 홈디렉터리에 있는 파일들중 소유자명을 keum으로 가지고 있는 모든 파일의 수를 출력한 것입니다.

 

-type : 입력한 파일 종류를 가진 파일들을 찾습니다.

b : 블록 파일

c : 문자 파일

d : 디렉터리 파일

f : 파일

l : 심볼릭 링크 파일

 

 

현재 위치에는 디렉터리가 2개 있는 것을 확인 할 수 있습니다. 하지만 find 명령어로 디렉터리 파일을 세자 146개나 나온것을 확인 할 수 있었습니다. 이는 숨겨진 디렉터리까지 다 포함시키기 때문입니다.

 

 

숨겨진 파일들을 조회하는 ll -a 명령어를 사용해보니 총 디렉터리가 9개 있는 것을 볼 수있습니다. 하지만 저희가 find로 찾은 디렉터리는 146개 였습니다.  이는 하위 디렉터리들까지 모두 카운트 했기 때문입니다.

 

-perm : 입력한 허가권을 가진 파일들을 찾습니다

 

 

action

-print : 검색한 파일들 경로를 검색한 위치를 기준으로 상대적 경로로 알려줍니다. 

 

검색 위치를 현재로 한 첫번째 명령어는 현재 위치를 기준으로 newfile 파일의 경로를 상대경로로 알려줬습니다. 두번째 명령어 또한 검색 위치(/)에 따라 newfile 파일의 경로를 상대경로로 알려준것입니다. GNU에서 -print는 디폴트 값이기 때문에 생략이 가능합니다.

 

-exec 명령어 : 검색한 파일에 해당 명령어를 실행하라는 뜻입니다.

 

find -name "new*" : new로 시작하는 파일들을 검색하라는 명령어입니다.  new*를 " "(쌍따옴표) 또는 ' '(작은 따옴표)로 감싸야 검색이 됩니다.

파일들을 검색한 결과를 {}에 넣고  -exec rm -rf 제거 명령어를 실행하겠다는 것입니다. 마지막 \;는 -exec를 사용할때 마지막에 꼭 넣어줘야 하는 명령어입니다.

 

 

이상으로 find & locate에 대해 공부해 보았습니다. 다음 시간에는 프로세스에 대한 내용을 공부해보겠습니다.

 

 

 

다음 내용

Linux - 프로세스 - 1 (정의)

 

 

 

'Linux' 카테고리의 다른 글

Linux - 프로세스 - 2 (종료, 종류, 제어)  (0) 2021.08.17
Linux - 프로세스 - 1 (정의)  (0) 2021.08.16
Linux - grep & 정규 표현식  (1) 2021.08.08
Linux - 마운트  (0) 2021.08.07
Linux - 패키지 관리 도구 rpm & yum  (0) 2021.08.02