본문 바로가기

별걸다하는 IT/리눅스 유닉스

[유닉스/리눅스] find 특정 파일 찾기, 디렉터리 찾기, 현재디렉터리에서 검색하기 (find 옵션, 연산자,예시)

반응형

[리눅스 유닉스 셸 프로그래밍 목차, 포스팅 링크 모음]

안녕하세요 오랜만이예요~~

어떤 글자가 들어가는 파일이나 디렉터리를 찾고 싶을 때, 또는 경로를 찾고 싶을 때 사용하는,

주구장창 사용하게 될 find명령어를 들고 왔어요

find

$ find [path] 옵션 정규식/표현

말 그대로 find! 찾다입니다.

현재 디렉터리부터 하위 디렉터리까지 주어진 여러 조건을 가지고 파일 및 디렉터리를 찾아서 출력해주는 명령어입니다.

리눅스에서 가장 강력한 찾기 명령어이지만 접근 제한된 파일까지 찾아주지는 않아요. (퍼미션 디나이드 에러 뜸)

path

문법에 보면 find 다음이 디렉터리를 의미하는데

사진 세 개 다 모두 같은 뜻입니다. 점은 현재를 뜻해요. 현재 안에 있는 하위 디렉토리까지 찾아서 출력해줘라는 거~ 위치를 특정하게 지정해주고 싶으면 path부문 점 대신 경로를 넣어주면 되겠죠?

(근데 제가 사용하는 서버 유닉스로는 path를 생략하면 명령어가 안먹네요 참고하세요~

리눅스버전이나 유닉스버전이나 어떤 OS를 사용하느냐에 따라 미세한 차이는 있을 수 있어도 대략적인것은 같으니까~!)

옵션 및 조건연산자

옵션

의미

-name

주어진 이름의 파일이나 디렉터리를 찾습니다

(아무래도 이름가지고 찾는 경우가 많기 때문에 엄청 많이 쓰게 될 옵션입니다.)

$ find -name '*.txt'

현재 디렉터리 이하의 모든 디렉터리에서 .txt로 끝나는 파일 및 디렉터리를 싹 찾는다.

-user

지정한 사용자의 파일이나 디렉터리를 찾는다

(위에가 이름가지고 찾았다면 이거는 사용자 기준입니다)

-group

지정한 그룹 소유의 파일이나 디렉터리를 찾는다

-uid

지정한 UID소유의 파일이나 디렉터리를 찾는다.(아이디번호로 찾기)

-gid

지정한 UID 소유의 파일이나 디렉터리를 찾는다 (그룹번호로 찾기)

-perm

지정한 허가권 값을 갖는 파일이나 디렉터리를 찾는다 (permission의 약자겠죠?)

ex) -perm 755 : 퍼미션 값이 755로 설정된 파일이나 디렉터리

-type

지정한 파일 유형을 찾는다. 

(이거 많이 씁니다. 파일만 찾고 싶을때 또는 디렉터리만 찾고 싶을 경우가 많기 때문이예요)

d: 디렉터리, f: 일반 파일, l: 링크 파일, b: 블록 디바이스, c: 캐릭터 디바이스, p:파이프 디바이스, s:소켓 파일

(주로 -type f 옵션이나 -type d 옵션을 많이 쓰게 되더라고요)

-atime n

n일 이전에 접근한 파일 찾기 (exactly)

+n은 말그대로 플러스니까 n보다 오래된 녀석들 기준 (greater),

-n은 n일부터 지금까지 즉 n일 내에 접근했던 파일들을 불러줍니다. (less)

-ctime n

change time 기준으로 찾는다 

-mtime n

modify time 기준으로 찾는다

(modify랑 change의 차이는 modify는 내부 내용이 수정된 시간을 기준으로 말하고 change는 메타데이터가 변경 될때 기준입니다. 메타데이터는 퍼미션을 변경했을 때 등등 파일 상태가 변경됐을 때 변경돼요)

-mmin n 

time은 기준이 day, 즉 일이라면, min은 분이 기준입니다. 

(아무래도 mmin보다는 mtime을 더 많이 사용하겠죠?)

-empty

빈 파일을 찾습니다. 빈 파일(파일의 크기가 0일 경우)이나 빈 디렉터리일 경우 출력

-exec

찾아진 파일 등과 연계하여 어떠한 명령을 내릴 수 있는 옵션입니다. 실행파일이라는 뜻이 아니라 얘를 실행하고나서 이 결과들을 가지고 추가적인 작업을 같이 진행하겠다라고 생각하시면 됩니다. 

결과값은 {} 기호로 표시하고 \;로 끝내야 함.

-ls

ls명령어알죠?!

이 옵션을 사용하면 상세 출력하는 'ls -l'과 같은 역할을 합니다.

-size n

n블록 길이의 파일을 찾습니다. 앞에서 +,- 기호와 유사하게,

+n은 n블록보다 큰 파일을 찾으며 (greater)

-n은 n블록보다 작은 파일을 찾습니다 (less)

보통 nc라는 형태로 많이 사용되는데 n은 문자 길이의 파일을 의미하고, c는 character를 의미하여 1문자는 1바이트이므로 보통 바이트 단위로 인식해서 사용합니다.

-inum n

node번호가 n인 파일 찾기~

-iname

대소문자 구별 안하고 이름으로만 찾을 때 (insensitive의 약자예요)

(얘도 개인적으로 자주 쓰는 옵션이예요. 맨날 SHIFT눌러서 대문자 쓰기 힘들잖아요..)

-maxdepth n

검색 시 주어진 정수값 n만큼의 서브 디렉터리만 검색.

현재 내 폴더에서부터 n 깊이까지만 ~

(참고로 운영체제에 따라 지원하기도 하고 안하기도 합니다. 솔라리스의 경우 maxdepth를 지원하지 않아요. )

-mindepth n

maxdepth의 반대입니다. 그 디렉터리부터 하위디렉터리까지 쭉 아래까지 내려가는 느낌으로 파고드는거

-prune

찾은 결과 중 디렉터리가 해당될 때 그 디렉터리 이름만 출력하고 하위 디렉터리에 해당되는게 있어도 들어가서 찾지 않는다

(밑에 내리면 예시로 좀 더 쉽게 이해할 수 있습니다~)

-newer

-newer 옵션 뒤에 적힌 파일보다 최근에 변경된 파일을 찾습니다

ex) find -newer 'abc.c'

abc파일보다 최근에 변경된 파일을 찾음

-cnewer

앞의 newer가 내용 변경이라면 cnewer라면 파일 상태 즉 change기준입니다.

2>/dev/null

옵션은 아니지만 맨 뒤에 이거 붙이면 퍼미션디나이드 된거는 화면에 출력하지 않습니다

(밑에 예시~)

 

자주 쓰게 될 명령어 예시

참고로 유닉스에서는 ''를 붙였는데 vmware에서 리눅스우분투는 따옴표 없이 그냥 find *abc*이런식으로 해도 되더라고요 참고하세요~!

 

당연히 찾는 명령어를 많이 쓰겠죠? 개많이씁니다.ㅎㅎㅎ 하다보면 그냥 암기하게 될거예요..ㅎ ㅠ

 

현재 위치에서부터 찾을 때, find . -name '*abc' 이렇게 쓰지만,

너무 많은 결과가 출력되면 보기 복잡해지니까 뒤에 타입까지 지정해줍니다.

$ find . -name '*abc*' -type d

--> abc가 들어가는 디렉터리 모두 뽑아줘

 

참고로 옵션 순서는 상관 없어요

$ find . -type f -name '*abc*'

--> 이렇게 하면 파일 찾아달라는 뜻이 되겠죠?

 

$ find /mollang '*.c' | head -10

이렇게 응용할수도 있겠죠? 몰랑 디렉터리에 있는 c로 끝나는 파일을 10개만 먼저 출력해줘.

 

$ find . -mtime +10 -type f -ls

수정한지 10일 이상된 파일만 뽑아서 자세히 출력해줘

 

$ find . -name "*.tar" -mtime +10 -delete

수정한지 10일이 지난 오래된 tar파일들만 골라서 삭제해줘!

cf 참고로 오래된 로그를 자동으로 정리해줄 때 잘 사용되는 명령어입니당

 

$ find . -size +300k

파일 크기가 300KB 이상되는 파일만 보여줘

-exec 예시

exec이용해서 빈파일 정리할 때~

$ find . -empty -exec rm {} \;

-->빈 파일들을 찾아서 모두 삭제해줘 (결과로 나온 {}를 모두 삭제해줘 rm은 삭제하는 거니까)

보면 파일 크기가 0인 파일이 두 개가 -empty 옵션에 의해 정확하게 출력된 것을 확인할 수 있어요

rm으로 삭제하고나서 다시 확인해보니까 크기가 0이 아닌 파일 하나만 제대로 남았네요!

 

$ find . -name '*.txt' -type -f -exec rm {} \;

--> 현재 디렉터리에서 .txt로 끝나는 모파일들을 찾아 삭제한다.

 

$ find ./ -type f -name '*.txt' -exec grep 'abc' {} \;

이번엔 문자열을 행에서 검색해서 뽑아주는 grep과 같이 써봤어요

텍스트 파일 중 abc라는 문자열이 들어 있는 행들을 싹 뽑아줘

파일을 일단 거르고 거기서 grep을 쓰는거기 때문에 각 뽑혀진 문자열이 어느 파일에서 뽑힌건지는 나오지 않아요

보면, -exec쓰기 전까지는 txt로 끝나는 파일들을 찾아서 다 출력해주고

이 txt파일들에서 grep 'hel*'한 값을 해당 명령어의 결과값으로 출력해준다. (어느 파일에서 해당 문자열을 찾았는지는 나타내주지 않음)

grep만 사용했을 경우에는 어느 파일에서 해당 문자열을 찾았는지가 나옴

이정도 차이?!

-prune에 관해서

알아두면 유용하게 사용할 수 있는 액션인것 같아요

-prune에 관해서 잘 정리된게 있길래 바로 사진 첨부!!

출처: http://coffeenix.net/board_view.php?cata_code=0&bd_code=1678&bpage=

2009라는 글자나 파일을 찾을 때

find . -name '*2009*'이렇게 찾으면 2009어쩌구 디렉터리 내에 2009어쩌구 파일이 있으면 그거까지 싹 뽑습니다.

-prune만 쓰면 그 현재 디렉터리에 있는 일단 해당되는 파일들은 다 뽑고, 디렉터리도 뽑아주는데 그 디렉터리 내부의 파일들은 뽑지 않아서, 좀 더 간편하게 볼 수 있습니다. 다만 디렉터리는 2009를 포함하지 않는데 그 하위 파일들이 2009 이 들어있으면 같이 뽑습니다. 

즉 해당 예시로는 2008디렉터리에 2009파일이 있으면 2008/2009file을 뽑아주고

2009디렉터리가 있으면 2009디렉터리만 뽑고 내부 파일들은 뽑지 않습니다.

prune은 파일이나 디렉터리가 엄청 많을 때~~~ 유용해요.

permission denied 없애기

참고로 접근 제한된 파일이 경우 출력해주지 않고 아래 사진처럼

출처: https://www.cyberciti.biz/faq/howto-find-a-directory-linux-command/

permisson denided알람이 뜹니다.

이 메세지를 피하기 위해서는

find /dev 'test*' 2>dev/null

앞에 옵션테이블에 넣었듯이 이렇게 뒤에 붙여주면 됩니다 (정확히 말하자면 옵션은 아니고 리다이렉션이지만,,)

 

이 외에 정규식도 당연히 사용가능하겠죠?

maxdepth의 경우

maxdepth의 경우 유용하죠

maxdepth level은 음수는 안됩니다. 

n이 무엇을 의미하는지 이해하기 편하게 명령어로 확인해봤습니다.

현재 jhnyang이라는 디렉터리에 들어와있는데 이 디렉터리는 3개의 디렉터리와 3개의 파일을 가지고 있어요.

maxdepth가 1일경우 내가 가지고 있는 파일 내에서 검색해주고,

2일 경우는 한 번 디렉터리를 더 내려가네요

 

다만 운영체제에 따라 지원하기도 하고 안하기도 합니다. OS에 따라 이런경우가 많아요.

예를 들어 솔라리스는 maxdepth를 지원하지 않아요.

명령어를 쳤다가 잘 먹지 않는 것 같으면 man명령어(도움말 명령어)를 이용해서 해당 옵션을 지원하고 있는지 확인하는 습관을 들이도록 합시다.

이럴 경우 -prune이나 grev&정규식을 이용해서 표현하는 수밖에 없습니다.

grep -v '^./.*/'하면 현재디렉터리

grep -v '^./.*/*/' 현재 + 그 바로 다음 하위 디렉터리까지

grep -v '^./.*/*/*/' 점점 내려가기~!

grep은 grep명령어와 정규식 포스팅을 참고해주세요

!연산자 사용하기

그리고 하나 더 알면 도움되는게 !은 not기능을 합니다

$ find ! -type f

--> 파일이 아닌 것을 찾아줘!

예시는 반대로 디렉터리가 아닌걸 찾아봤습니다.

기존에 있던 abcdef 텍슽 파일에 추가적으로 file1, file2를 만들어주고

디렉터리 두 개도 만들어줬어요. 디렉터리는 파란색으로 표시되므로 dir1 dir2가 디렉터리인 것을 한 번에 알 수 있죠~~ 나머지 빨간 줄 친건 파일임을 명시해놓은거

그 밑에 find ! -type d 하니까 디렉터리가 아닌, 즉 파란색을 제외한 나머지가 출력된 것을 확인할 수 있어요!

 

이런 연산자의 종류로는 AND, OR, NOT, ()등이 있습니다.

1. operator1 -a operator2 -->AND연산

2. operator1 -o operator2 -->OR연산

3. not은 앞에 한 것처럼 '!'기호

4. ()는 논리우선연순위지정

()는 우리 수학 배울 때 괄호에 있느거 우선적으로 계산했잖아요. 그거입니다.

find명령어는 기본적으로 왼쪽에서 오른쪽으로 계산이 수행됩니다. 필요한 상황이 아니더라도 명령어 가독성을 높이기 위해서 사용되기도 해요 (수학에서 그랬듯이 ㅎㅎ)

커맨드 라인에서 사용할 때는 반드시 인용부호를 사용해야 find의 명령 인자로 인식될 수 있습니다.

 

$ find . -name '*.h' -o -name '*.c'

파일이름이 .h로 끝나는 거나 .c로 끝나는거 뽑아줘

 

너무 기본이지만, 강력하고 많이 쓰이는 명령어 find를 오늘 알아봤습니다~

(디렉터리 구조를 볼 수 있는 tree라는 명령어와 grep이라는 명령어와 함께 사용하면 익히기 더욱 좋아요)

혹시라도 잘못된거나 오타가 있으면 알려주세요♥

도움이 됐다면 공감살포시 ♥

다음 포스팅에서 또 봬요!

반응형