관리 메뉴

IT창고

리눅스 find 명령어 활용 본문

서버운영/Linux

리눅스 find 명령어 활용

방구석여포 2017. 9. 7. 00:12

리눅스에서 find 명령어는 파일검색 명령어입니다. find를 단독으로 사용하면 활용도가 낮지만 파이프'|'와 함께 사용하게되면 그 활용도는 무궁무진합니다. 이번에는 이 find 명령어를 활용해보는법을 알아보겠습니다.


find의 형식은 find [경로] [옵션] [명령] 입니다. find의 옵션 또한 굉장히 많은데 그 많은 옵션 중 자주 사용하는 옵션 몇개를 알아보겠습니다.

-perm 옵션은 지정한 허가권을 가지고 있는 파일을 검색합니다 -perm [허가권] 옵션은 정확히 [허가권]과 일치하는 파일을 검색합니다 ex) find /gsk -perm 777  

또한 -perm +[허가권]과 -perm -[허가권]이 있는데 +는 하나라도 포함되면 전부 찾아주고 -는 예시로-770 일 경우 파일에 77은 무조건 있는 파일을 찾아줍니다. ex) find /gsk  -perm +777 , find /gsk -perm -770 

-perm옵션을 활용해보면 SetUID가 걸린 파일을 찾아 보는데 사용할수있습니다 SetUID파일은 root권한을 탈취할때 사용될수있기 때문에 꼭 확인해야합니다. ex) find / -perm +4000 2> /dev/null 1> /root/SetUIDList 


-size 옵션은 파일크기를 이용해서 파일을 검색하는 옵션입니다. 실습해보자면 fallocate라는 명령어가 있는데 의미없는 내용으로 파일에 원하는 크기를 할당해서 파일을 만드는 명령어입니다. ex) fallocate -l 10K File

ex) find /gsk -size 10k 하면 10k파일을 gsk디렉토리에서 찾아줍니다.


- name 옵션은 파일 이름을 기준으로 파일을 검색하는 명령어입니다. ex) find / -name "cron*"

- type 옵션은 파일 혹은 디렉토리 같은 파일의 타입으로 파일을 검색합니다. 


find의 [명령]에 대해 알아보겠습니다.  -delete 는 검색결과를 삭제합니다. -exec [명령어] \; 는 검색결과를 지정한 명령어로 처리합니다. -exec [명령어] {} \; 는 검색결과를 차례대로 매칭하면서 지정된 명령어를 처리합니다.

아래의 표는 find [명령]을 활용한 예 입니다. 

find /gsk -type d -name "dir*" -delete 

결과: -delete를 수행하여 gsk디렉토리에 디렉토리 타입의 이름이 dir로 시작하는 모든 디렉토리를 삭제합니다. 

 find . -type f -exec ls -l \;

 결과: 현재 디렉토리에서 검색결과마다 ls -l을실행합니다. (즉 fi1 fi2 fi3 3개의 파일이있다면 ls -l을 세번실행)

 find . type f -exec ls -l {} \;

 결과: 검색결과가 {}안에 들어가고 검색결과가 명령어의 인자로 사용됩니다.

ex) 0000~0990까지의 파일이존재

find /gsk -name "0**0" -exec gzip {} \;

즉 gsk디렉토리파일에 0000~0990파일 전부 gzip로 압축합니다.

위의 내용을 참고하여 활용을 하면 아래와 같습니다.

1. find를 사용하여 파일의 크기가 10k인 파일명만 출력하고 정렬하기

find를 사용할경우: find /gsk -size 10k | cut -d "/" -f 3 | sort -n  혹은 find . -size 10k -exec basename {} \;

find를 사용하지않을 경우: ls -lh | grep "10K" | cut -d " " -f 8 |sort -n

2. find를 사용하여 크기가 10k인 파일을 삭제하기

find를 사용할 경우: find /gsk -size 10k -delete  혹은 find /gsk -size 10k -exec rm {} \;

find를 사용하지 않을 경우: ls -lh | grep "20K" | cut -d " " -f 8 | xargs rm


xarge(eXetendsd ARGuments)는 표준 출력 값을 이용하여 다음 명령어의 인자로 전달하며 find와 같이 사용하면 결과를 다음 명령어에 인자로 전달하는 역활을 합니다. (-exec {} \;과 비슷한 기능을 합니다.)

xarge의 옵션이 두 가지 있는데 -i 는 인자를 문자열로 전달하고 -t 는 상세한 정보를 출력합니다.(실행결과를 출력합니다.)

ex) 000~999까지의 파일이 gsk디렉토리에 존재합니다.

ls | xargs -t -i mv {} {}.linux  -> 000~999까지의 파일에 .linux가 붙습니다.

원상복구하는 법으로 ls | cut -d "." -f 1 | xarge -t -i mv {}.perm {} 을 사용하면 다시 파일이름이 원상복귀됩니다.


Tip

서버관리를 하다보면 어떤 디렉토리에 쓰레기파일들이 싸여 파티션의 공간을 비워야할때가 있습니다. 디렉토리를 통째로 없애지는 못하고 안에 하나의 파일당500k 정도의 파일이 1천만개는 있는데 이럴 경우 해당 디렉토리에서 rm -rf ./* 로 삭제하려 할것입니다. 하지만 rm명령어 뒤의 인자는 3만개 정도의 인자만 사용할수있어 rm -rf ./* 명령어로는 1천만개의 쓰레기파일을 삭제할수없습니다. 파일하나하나 지우면 몇년이 걸릴지도 모르는 작업인데 이럴때 xarge를 사용할수 있습니다. ls | xargs rm 를 입력하면 1천만개의 쓰레기파일을 삭제할수 있습니다. 그 이유는 rm -rf ./*는 하나의 프로세스에 인자를 여러개를 입력하기에 모두 삭제가 불가능하고  ls | xargs rm 는 여러개의 프로세스에 인자를 하나만 넣기에 모두 삭제가 가능합니다. 

'서버운영 > Linux' 카테고리의 다른 글

리눅스 소프트웨어 관리  (0) 2017.09.09
리눅스 부팅프로세스  (0) 2017.09.08
리눅스 압축과 아카이브  (0) 2017.09.06
리눅스 파일시스템 쿼터  (0) 2017.09.05
리눅스 RAID구성  (0) 2017.08.31
Comments