728x90
반응형

자... 이건 서버에 접속해서 뭔가를 하는 사람의 경우.. 아주 요긴하게 쓰입니다 ㅎㅎ

저역시.. 요즘들어서 서버에 접속해서 이것저것 만질일이 많다보니까...

결국 find 의 카드를 꺼내게 되었는데요...

 

오늘은 find 명령어를 통해서 검색한 파일들을 대상으로 어떠한 처리를 하는 방법에 대해

소개를 해 드릴까 합니다.

고수분들은 이런것따위야 눈감고도 할테니... 아직 긴가민가.. 하시거나 모르시는 분들은 봐주세요 ㅎㅎ

 

 

일단...오늘 사용할 find 명령어에 대해서 잠깐 설명을 드리자면..

말그대로 뭔가를 찾는겁니다 ㅎㅎㅎㅎㅎㅎ

하지만 linux 에서는 파일이든 디렉토리든.. 제대로 쓸 줄만 안다면 정말 간편하게 찾아서 뭔가를 할수있는

그런 강력한 명령어가 된답니다.

 

 

간단하게 구문을 보면...

 

 

find [ 검색할 장소 ] [옵션]

 

이렇게 됩니다.

 

가장 간단하게 사용한다면...

 

find / -name "*.txt"

 

/ 이하의 모든 디렉토리 및 파일중에서 .txt 로 끝나는걸 찾아라

(즉, 확장자가 txt 인 파일을 찾아라)

 

라는 말이 되겠죠? ㅎ

디렉터리 이름을 .txt로 끝나게 안만드는 이상은 파일만 나올겁니다 ㅎ

 

 

오늘은... 일수를 검색해서 파일을 찾은다음에.. 찾은 파일만 처리를 하는걸 진행할겁니다.

그래서... -ctime 옵션을 사용하겠습니다 ㅎ

 

 

ctime , atime , mtime

시간을 이용해서 검색하는 이 옵션에 대해서 잘 모르시는 분들은..... 좀 더 자세한 문서를 검색해주세요 ^^;;

저는 간단히 말씀드리겠습니다.

 

ctime : chmod, chown 으로 파일의 정보가 변경된 시간

atime : 파일을 열어본 시간

mtime : 파일의 내용이 변경 된 시간

 

여기 기준이 참 애매한데요.. 저는 ctime 의 c가 create 라고 생각하고 있었답니다 ㅋㅋㅋ

그래서 언제나 ctime 옵션을 사용했었죠...

어지간하면 chmod 나 chown 은 잘 사용 안하니까요..;;;;

아무튼... 저는 ctime 으로 해보겠습니다.

 

 

 

 

서버에서 로그파일을 대상으로.. 한번 진행해봤습니다 ㅎㅎㅎ

 

일단.. 각 옵션에 들어가는 숫자에 대해서는 이렇습니다.

 

-ctime -4 : 파일정보가 변경된지 지금으로 부터 4일 이내의 것

-ctime +4 : 파일 정보가 변경된지 지금으로 부터 4일 이후의 것

 

기호의 차이가 느껴지십니까? ㅎㅎㅎ

 - 를 쓰면... 명령어를 실행시킨 기준으로 4일 전까지를 범위로 지정합니다.

+를 쓰면... 명령어를 실행시킨 기준으로 4일전 부터 까마득한 과거까지 범위로 지정을 합니다.

 

 

아리송 하신가요? ㅎㅎㅎㅎ

 

간단하게... 12월 5일 0시에 명령어를 -ctime -4 로 명령어를 실행시키면...

12월 5일 0시 부터 12월 1일 0시까지가 검색 범위가 됩니다.

(5일 0시이므로... 1일 전은 4일 24시부터 0시까지...)

 

하지만 -ctime +4 로 명령어를 실행시킨다면.. 11월 30일 24시 부터 그 이전의 모든 시간이 범위가 됩니다.

4일이 되는 시점이 12월1일 0시니까.. 5일로 들어가는건 11월 30일 23시 59초가 되겠죠? ㅎㅎㅎ

그냥 알기쉽게 24시라고는 했지만.. 정확하게는 이렇답니다 ㅎ

 

 

아무튼.. 이런 사실만 알아주시고 넘어가시면 되겠습니다.

 

 

 

 

우선.. 테스트를 위해서 test 라는 디렉토리를 생성하겠습니다.

 

 

 

 

여기서 실행된 명령어는 다음과 같습니다.

 

find ./whistl/* -ctime -4 -exec echo '{}' \;

 

 

find [ 검색할 경로 ] [옵션] -exec [ 실행할 명령어 ]

 

이렇게 생각하시면 되는데요... whistl 디렉토리에 * 를 붙이는건 개인 취향차이입니다 ㅎ

 

뒷쪽에 못보던 구문이 있는데요..

 

-exec 라는건.. find 다음에 명령어 처리를 한다는 말입니다.

 

echo 는 아시죠?? 하지만 이 뒷쪽이 뭐이런게 다있냐...싶으실텐데요 ㅎㅎ

바로 이부분이 find 를 보다 효과적으로 사용하기 위한 부분입니다.

 

{} : find 에서 찾아낸 검색 결과가 하나씩 들어가는 부분이구요..

\; : -exec 다음부분에 나와있는 명령어를 실행하라는 부분입니다 ㅎ

 

\; 가 없으면.. 실행이 안되니까 주의하시구요.. 뭐 제일 뒤에 붙이는거니까

그냥 공식으로 생각하시면 됩니다 ㅎ

 

하지만.. {} 의 경우에는.. 필요한 부분에 쓰시면 됩니다.

 

 

만약.. find ./whistle/* -ctime -4 의 결과에서 다음과 같은 파일이 나왔다고 생각해볼까요?

a.txt

b.txt

c.exe

 

3개의 파일이 검색이 되었습니다.

 

그럼 -exec 를 붙여서 한번 볼까요?

 

find ./whistle/* -ctime -4 -exec echo '{}' \;

 

조금 복잡한 그런 구문이 되었는데요... 하나하나 풀어보겠습니다.

 

( find ./whistle/* -ctime -4 ) = ( a.txt , b.txt , c.exe )

-exec = 내 뒤로오는 명령어를 실행할꺼야

echo '' = '' 안의 문자를 출력할꺼야

\; = 실행 개시!!

 

이런 식인데요... find 에서 3개의 파일이 나왔으니.. 실제로 동작은 이렇게 됩니다.

 

echo 'a.txt'

echo 'b.txt'

echo 'c.txt'

 

그래서 결과는 3줄의 출력결과가 나오는거죠...

알기쉽게 하려고 설명이 길어졌는데... 오히려 더 복잡해진건 아닐까 걱정이 되네요 ;;;

 

여기서 검색결과는 위에서부터 하나씩 {} 로 대입이 된다고 말씀드렸죠?

 

 

그럼 응용으로...

 

find ./whistle/* -ctime -4 -exec rm -f {} \;

 

이렇게 입력을 하면 어떻게 될까요?

rm -f 는 묻지마 삭제입니다 ㅋㅋㅋ

 

 

다음 3줄이 실행이 됩니다.

 

rm -f a.txt

rm -f b.txt

rm -f c.exe

 

 

결국 find 로 찾아낸 파일을 다 삭제를 하는 그런 구문이 되겠네요 ㅎ

 

약간 감이 잡히시나요? ㅎㅎ

 

여기서.. {} 는 명령어에 따라 위치를 바꿀수도 있답니다 ㅎㅎ

 

 

 

 

find ./whistle/* -ctime -4 -exec cp -a {} ./test \;

 

이렇게 입력을 했습니다.

cp -a 는.. 속성을 그대로 안고 복사를 하라는 옵션입니다 ㅎ

 

{} 와 \; 는 꼭 붙어있어야 한다는게 아니란걸 알기위한 그런 명령어인데요..

제가 처음에 이기능을 쓸때는.. {} \; 라고 끝에 무조건 붙어야하는줄 알았었거든요..;;;

그래서 혹시나 저같은 분이 계시지는 않을까 싶어서 설명드립니다 ㅎ

 

 

자... 여기서는 검색결과를 test 디렉토리로 복사를 해라!! 라는 명령어가 되겠습니다.

 

제가 위에서 예를들었던거라면... a.txt , b.txt , c.exe 가 test 안으로 복사가 되었겠지만...

실제로는 로그파일이죠? ㅎㅎㅎ

find ./whistle/* -ctime -4 의 검색결과는 제일 처음 캡쳐에 있답니다 ㅎ

그 파일들이... test 안으로 들어갔는지 한번 볼까요??

 

 

 

오오!!!!!!

멋지네요 ㅋㅋㅋㅋㅋㅋ

 

 

이걸로 설명이 된걸까요???

 

-exec {} \; 의 사용법..

이걸 잘 사용할수 있게 된다면.. 일정한 날짜.. 또는 특정 조건에 일치하는 파일들만 골라서

어떠한 처리를 하는것이 편하게 된답니다 ㅎㅎㅎ

 

 

 

혹시나 이해가 잘 안가는 부분이 있으시면... 댓글 남겨주세요 ㅎ

제가 아는 범위안에서 설명드릴께요 ㅎㅎ

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,