Linux/Common

xargs, find 명령어

scii 2013. 5. 8. 01:58


xargs 

xargs 명령은 입력된 데이터를 라인 단위로 읽어서 argument화하는 명령이다.

find 명령을 사용하여 검색한 파일에 대한 처리를 위해 파이프로 연결하여 사용한다.


위의 명령은, which 명령에 의해 출력되는 bash 실행 파일의 경로가 /bin/bash인데, 이 결과 값이 파이트와 xargs에 의해 ls -l 아규먼트로 대입되어 결국 ls -l /bin/bash 명령을 수행한 결과를 출력하게 된다.



find

find 명령은 디렉토리 계층에서 파일을 검색하기 위한 명령이다. 

find 명령으로 검색한 결과 값은 하나의 라인에 하나의 파일명이 출력되는데, 이 결과 값을 파이프로 연결하여 여러가지 명령의 아규먼트로 전달하여 원하는 명령을 실행하고 그 결과 값을 얻어낸다.


형식

1) -exec를 사용하여 검색된 결과를 명령의 아규먼트 ({})로 사용한다.

# find ... -exec 명령 {} \;

2) xargs 명령을 사용하여 파이프로 전달된 결과를 표준 입력 아규먼트로 받아서 명령을 실행한다.

# find ... | xargs 명령


find 옵션


 find 옵션

의        미 

 -name 파일명 

 파일명으로 검색한다. 

 -user 유저명 

 유저명 또는 UID로 검색한다. 

 -group 그룹명 

 그룹명으로 검색한다. 

 -perm nnn 

 퍼미션이 nnn인 파일을 검색한다.

 예) -perm 755

 # find . -perm -100 -print

 실행 가능한 --x------ 파일을 찾는다.

 -perm 인자가 마이너스(-) 부호를 가지게 되면 setuid 설정 비트를 포함한 모든 퍼미션 비트들이 검사된다.

 -type x 

 파일 타입이 x인 파일을 검색한다.

 b(블럭 특수 파일), c(문자 특수 파일), d(디렉토리), p(파이프), f(정규표현 일반 파일), l(심볼릭 링크 파일), s(소켓) 

 -atime +n 

 접근 시간이 n일 이전인 파일을 검색한다. (access) 

 -atime -n 

 접근 시간이 n일 이내인 파일을 검색한다. (access) 

 -ctime +n 

 n일 이전에 변경된 파일을 검색한다.

  (change: 내용 수정이 아니라 모드 변경 또는 접근 시간 변경)

 -mtime +n 

 n일 이전에 내용이 수정된 파일을 검색한다. (modify) 

 -mtime -n 

 n일 이내에 내용이 수정된 파일을 검색한다. (modify) 

 -empty

 파일이 비어있고 (0 bytes) 일반 파일, 디렉토리를 검색한다. 

 -newer 파일명 

 파일명의 파일보다 최근에 수정된 파일을 검색한다. 

 -size n 

 파일 블록 크기가 n 이상인 파일을 검색한다.

 b(블럭 -기본값), c(bytes), k(kbytes), w(2바이트 단어) 

 -links n 

 링크된 개수가 n인 파일을 검색한다. 

 -print 

 표준 출력 

 -exec 명령

 검색된 파일을 찾으면 command 명령을 실행한다.

 명령 인자(검색된 파일)는 {}으로 사용하며, 이때 명령 끝은 \;(;이 아님)을 사용해야 한다.

 즉, 명령구분 문자인 ';'을 이스케이프(\) 시켜 주어야 한다.  

 -operator 

 -a: and 연산, -o: or  연산, !: not 연산 

 -path 패턴

 path가 패턴과 일치하는 path에 대해서 검색한다.  

 -regex 패턴 

 파일명이 패턴과 일치하는 정규 표현식에 대해서 검색한다. 



find 명령에서 사용하는 -atime, -ctime, -mtime 옵션에서의 시간들은 일(하루 24시간) 단위이다. 

부호 없는 숫자, 예를 들어 3은 정확하게 3일 전에 끝난 24시간을 의미한다. 다시 말하면 96시간과 72시간 이전 사이를 의미하는 것이다.


마이너스(-) 부호를 가진 숫자는 그 시간 이후에 기간을 가리킨다. 예를 들어, -3은 지금과 3일 전 사이의 모든 시간을 의미한다. 

다시 말하면 0시간 이전과 72시간 이전 사이를 의미하는 것이다.


플러스(+) 부호를 가진 숫자는 그 시간 이전의 기간을 가리킨다. 예를 들면, +3은 3일 이상된 시간을 의미한다.

다시 말하면 72시간 이상 지난 파일을 의미하는 것이다.



# find . -type f -exec file '{}' \;

쉘이 위치한 현재 디렉토리 아래에서 모든 파일을 검색하고 file 명령을 실행한다. 

'{}', 작은따옴표로 둘러싸인 브레이스는 쉘 스크립트에 의해 해석되지 않도록 하기 위한 것이며, find 명령으로 찾은 파일을 의미한다.

세미콜론(;)은 쉘에서 해석되지 않기 위해 백슬래시(\)를 사용하고 있다. 

만약 현재 디렉토리 아래의 grep 디렉토리에서 검색하려면 ./grep 를 지정하면 된다.


# find $HOMe -mtime 0

현재 쉘에 접속해 있는 자신의 홈디렉토리 아래에서 24시간(-mtime 0) 안에 수정된 파일들을 검색하여 출력한다.


# find . -name 'fi*'

현재 디렉토리부터 모든 하위 디렉토리까지 파일명이 fi로 시작하는 모든 파일을 검색하여 출력한다.


# find . -perm 755

현재 디렉토리부터 모든 하위 디렉토리까지 퍼미션이 755인 파일과 디렉토리를 검색한다.

위의 명령은 모든 파일과 디렉토리를 검색하였지만, -type f 옵션을 추가하면 일반 파일만 출력할 수 있다.

# find . -type f -perm 755


# find /home -newer here.sh

/home 디렉토리 아래에서 here.sh 파일보다 최근에 수정된 파일을 검색하여 출력한다.


# find /home -size +1024 -print

/home 디렉토리 아래에서 파일의 블록 크기가 1024 이상인 파일을 검색하여 출력한다.


# find ~/ -type d -print

홈 디렉토리 아래에서 디렉토리들만 검색하여 출력한다.


# find /home \( -name a.out -o -name '*.o' \) -atime +7 -exec rm '{}' \;

/home 디렉토리 아래에서 파일명이 a.out 또는 .o로 끝나는 파일을 검색하고, 7일 동안 사용하지 않은 파일(생성/변경 날짜가 7일 이상된 파일)이면 rm 명령을 사용하여 삭제하도록 하는 명령이다.


# find /tmp -name core -type f -print | xargs /bin/rm -f

/tmp 디렉토리 아래에서 파일명이 core인 파일을 검색하여 출력한다. 이때 검색된 파일 목록은 하나의 라인에 하나의 파일명이 출력되는데, 파이프로 연결된 xargs 명령에 의해 라인 단위로 /bin/rm -f 명령의 아규면트로 전달되어 검색된 모든 파일들을 삭제하게 된다.


# find . -type f -mtime +1 | xargs -n 100 rm -f

find 명령을 사용하여 현재 디렉토리 아래에서 현재 시간보다 하루(+) 전(24시간 내에 작성/수정된 파일만 제외) 에 작성/변경된 파일을 찾으면 라인 단위로 파일 리스트가 쉘에 출력된다.

이 파일 리스트는 하나의 라인당 하나의 파일명이 출력되기 때문에 각 라인의 파일명을 아규먼트화하기 위해 xargs 명령을 파이프로 연결한 다음 -n 100, 즉 100라인 (100개의 아규먼트) 을 한 번에 읽어서 rm -f [아규먼트] 로 치환하여 100개 단위로 검색된 파일들을 삭제하는 명령이다.