OS/UNIX 공통2012. 5. 11. 10:43
반응형

*  유닉스는 내부 프로세스 간의 커뮤니케이션을 위하여 세마포어를 사용한다.
 세마포어는 유닉스에 의해서 증감되는 정수(integer) 값 이다. 하나의
 세마포어에 대해서 하나의 프로세스만이 작업을 할 수 있도록 하여 프로세스
 간의 동기화를  유지하는데 이용된다.  다른 프로세스가 사용 중인 세마포어를
 이용하고자 하는  프로세스는 세마포어의 상태가 증가되거나 0 이 될 때 까지
 기다리게 된다.  (옵션에 따라 다를 수 있다).

*  유닉스에서의 세마포어는 한개 씩 이용되는 경우는 거의 없기 때문에 보통
 세마포어 집합으로 관리된다. 유닉스 커널이 설정될 때 시스템에서 사용
 가능한  세마포어의 최대 갯수와 세마포어 집합 당 최대 세마포어 갯수 및 할당
 가능한 세마포어 집합의 최대 갯수가 설정된다. 이 값들은 유닉스 커널을 다시
 만들고  시스템을 리부팅 하여야만 변경이 가능하다.

       <오라클과 세마포어>

   오라클은 백그라운드 프로세스들 간의 Concurrency 를 조절하기 위하여
 세마포어를 사용한다.  그리고 Fast(Shared Memory) Driver 가 사용되는 경우
 유저 프로세스와  쉐도우 프로세스 간의 Two-Task Communication 에도
 사용된다.

      <사용 중인 세마포어>

  현재 시스템에 할당된 세마포어를 확인하는 명령은 다음과 같다.

  # ipcs -sb

 이 명령은 할당된 모든 세마포어 집합과 ID Number, Owner, 각 집합의
 세마포어 수 등을 보여준다.  때때로 비정상적으로 종료된 오라클 프로세스에
 의해서  점유된  리소스가 릴리스 되지 않고 남아 있는 경우가 있다.  만약,
 오라클이 Shutdown 상태인데도 불구하고  ipcs  -sb 를 통해서 보았을 때
 오라클이 점유한 세마포어가 사용중으로 나온다면 그것들을 IPCRM명령으로
 Free 시켜야 한다.
 즉,  오라클이 할당한 세마포어 집합에 대하여

              #ipcrm -s ID   (ID는 ipcs 에서 출력됨)

 명령으로 릴리스 시킨다.   아니면 시스템을 리부팅 하여도 된다.

      <데이타베이스의 기동>

  오라클은 백그라운드 프로세스에 필요한 모든 세마포어를 데이타베이스
 기동시에 할당한다. init<SID>.ora 화일의 Processes 파라미터는 오라클에서
 할당할 최대 세마포어  갯수를 결정한다.

 ?가장 흔하게 발생하는 에러는 데이타베이스 기동시에 나타나는 다음과 같은
 에러이다.
     
      ORA-7279  :  spcre:semget error, unable to get first semaphore set

  시스템은 한 집합내에 가장 많은 세마포어를 가진 것이나  Processes 변수에
 의해 설정되는 세마포어 갯수 중 적은 값을 가진 첫번 째 세마포어 집합을
 할당하려고  한다.  만약, 시스템에 설정된 세마포어가 부족하거나, 세마포어가
 이미 너무  많이  사용중이거나, 사용중이지 않은 세마포어 집합이 세마포어를
 너무 많이  갖고 있는가를 체크해 보고 그렇지 않다면 시스템에 충분한
 세마포어를  할당하도록  한다.

 ?설정된 세마포어가 없거나 모든 세마포어가 이미 할당된 상태라면 다음과
 같은 에러가 발생한다.
   
      ORA-7251  :  spcre:semget error, could not allocate any semaphores

 ?첫번째 세마포어 집합이 할당되었지만 두번째 세마포어를 할당받지 못하면
 다음과 같은 에러가 발생한다.
 
      ORA-7252  :  spcre:semget error, could not allocate semaphores
 
  죽어있는 오라클 프로세스에 의해서 세마포어가 점유되어 있는가를 확인하고
 만약 그런 문제가 아니라면 더 많은 세마포어를 할당함으로써  문제를 해결할
 수 있다.
 
    <shutdown abort>
 
  Shutdown abort 명령이 내려지면 사용자 Process가 끝나기를 기다리지 않고
 오라클 백그라운드 프로세스는 죽게되고 그것에 의해서 점유된 세마포어는
 Release 된다. 사용자는 세마포어를 늘리거나 줄여서 데이타베이스에
 작업을요구할 때야 비로소 데이타베이스가 Shutdown 되었음을 알게 된다. 이
 때  사용자에 의한 세마포어 변경 요구는 실패하게 되며  유저 프로세스와
 오라클 Shadow Process도 함께 죽게 된다. 그러면서 다음과 같은 에러가
 발생한다.
 
       ORA-7264  :  spwat:semop error, unable to decrement semaphore
       ORA-7265  :  sppst:semop error, unable to increment semaphore

     <MIPS RISC 기반의 유닉스 시스템>

  DEC RISC Ultrix, MIPS machine 같은 MIPS RISC 기반의 유닉스 시스템의
 경우에는 오라클은 Startup시에 Latching을 위하여 별도의 세마포어를
 할당한다. 오라클은 이 때 할당된 세마포어를 사용자가 데이타베이스에 접속할
 때 Latch 로 사용한다. 프로세스가 죽게되면 프로세스에 의해서 변경된
 세마포어는 원래의 상태로 되돌아 간다. 따라서 접속하는 모든 프로세스는 Undo
 Structure를 할당할 수 있어야 하는데 Undo Structure가 충분하지 못하면
 다음과 같은 에러가 발생한다.

        ORA-9702  :  sem_acquire: cannot acquire latch semaphore

 해결방법은 Undo Structure가 사용가능할 때까지 기다리든지 시스템의 Undo
 Structure 의 최대값(SEMMNU)를 늘리면 된다.

        <Fast Driver의 사용>

  Fast Driver에 의해서 데이타베이스에 접속되는 경우에는 Shared Memory
 Buffer에 대한 사용허가를 관리하기 위하여 세마포어가 사용된다. 이 때 하나의
 접속되는 세션마다 3개의 세마포어로 구성된 세마포어 집합이 할당된다.

 ?시스템의 세마포어가 모두 할당되었다면 다음과 같은 에러가 발생한다.

          ORA-2721  :  osnseminit: cannot create semaphore set

  이 경우에는 이용가능한 세마포어가 생길 때 까지 기다려야 한다. 그리고
 비정상적으로  프로세스를 종료하는 경우에는 할당된 세마포어가 Release되지
 못하며 어떤 프로세스가 어떤  세마포어를 사용하는가를 구분하기 힘드므로
 사용상의 주의가 필요하다.

      <세마포어 사용 계획>

 세마포어 커널 파라미터의 이름, 조정 방법 및 커널 재생성 방법은 시스템에
 따라서 다르다.  필요한 세마포어의 갯수는 다음의 공식으로 구할 수 있다.

   proc(init<SID>.ora에서의 processes 파라미터)
   +  test(MIPS RISC 프로세서를 쓰는 경우는 1, 그 외에는 0)
   + 3 * f(fast driver connection 갯수)
   + sys(오라클 외의 프로그램에서 필요한 세마포어 수)
  ------------------------------------------------------------
   = tot(필요한 최소한의 세마포어 수)

  세마포어의 최대 갯수를 지정하는 파라미터(보통 SEMMNS)는 최소한 위에서
 계산한  값보다 커야 한다.

  일반적으로 하나의 집합마다 가능한 세마포어의 최대 갯수(보통 SEMMSL)는
 10~25 정도이다. fast driver를 많이 쓰는 경우라면 세마포어 집합의 갯수가 더
 많이  필요하다.

반응형
Posted by [PineTree]
OS/UNIX 공통2010. 5. 5. 09:24
반응형


리눅스 에서 하루전 의 날짜 출력

YESTERDAY=$(date +%Y%m%d --date '1 days ago')
echo $YESTERDAY
20100504

unix 에서 어제 날짜 가져오기

YESTERDAY=`TZ=GMT+15 date +%Y%m%d`; echo $YESTERDAY
20100504


YESTERDAY=`TZ=KST+15 date +%Y%m%d`; echo $YESTERDAY

*. 추가 사항

일반적으로 알고 있는 그리니치 기준 동경(+), 서경(-)로 생각하면 정 반대의 계산이 됨.. 반대 부호로 생각해야됨.. 삽질했음..

우리나라의 경우 표준 시간대가 'GMT+9'이므로, 하루 전을 계산하기 위해선 TZ=GMT+24가 아니라 TZ=GMT+15임.


반응형

'OS > UNIX 공통' 카테고리의 다른 글

ls 파일용량크기로 정렬하기  (0) 2015.02.08
세마포어에 대하여  (0) 2012.05.11
Linux find 명령어 완전 정복 가이드  (0) 2009.10.07
Posted by [PineTree]
OS/UNIX 공통2009. 10. 7. 14:05
반응형

저자 - Sheryl Calish

가장 강력하면서도 한편으로는 혼란스러운 유비쿼터스 명령어인 find 명령어에 대한 개요.

게시일 : 2008년 7월

Linux find 명령어는 모든 Linux 명령어 가운데 가장 유용하면서도 혼란스러운 명령어 가운데 하나입니다. 다른 Linux 명령어의 표준 구문과 다른 구문을 가지고 있다는 점에서 어렵습니다. 하지만, 파일명, 파일 유형, 사용자, 더 나아가 타임 스탬프 별로 파일을 찾을 수 있다는 점에서 강력한 명령어이기도 합니다. find 명령어를 사용하면 이러한 속성을 자유롭게 조합해 파일의 위치를 찾을 수 있을 뿐만 아니라, 찾은 파일에 대해 연산을 수행할 수 있습니다.

본 글의 목적은 find 명령어와 그 잠재적 이점을 개략적으로 설명함으로써 find 명령어를 손쉽게 학습 및 사용할 수 있도록 돕는 것입니다. 동시에, find 명령어의 특성 중 가장 강력하면서도 한편으로는 혼란스러운 측면에 대한 개요 및 참조를 제공할 것입니다.

[주: 여기에서 사용된 find 명령어는 GNU 버전이기 때문에 일부 세부 내용은 다른 버전의 find 명령어와 다를 수 있습니다.]

기본 형식

먼저, find 명령어의 기본 구조부터 살펴보겠습니다:

find   start_directory  test  options   criteria_to_match

action_to_perform_on_results

                       
아래 명령어에서 find는 이름에 “java” 확장자를 가지고 있는 모든 파일을 대상으로 “.”가 표시된 현재 디렉토리를 찾기 시작할 것입니다:
find . -name  "*.java"   

아래에는 검색 결과에 대한 간단한 목록이 나열되어 있습니다:

find . -name  "*.java"

./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java

..

[주: 본 글에서 잘라 붙이기를 해 find 명령어를 실행하는 경우에는 자체 키보드를 사용해 큰따옴표(“”)를 바꿔야 올바른 결과를 얻을 수 있습니다.]

아 래 명령어 역시 동일한 연산을 수행할 것입니다. 어떤 경우든, find 명령어에 전달되도록 escape 문을 통해 와일드카드 문자를 일반 문자로 처리해야 하며 쉘에 의해 해석되지 않아야 합니다. 따라서, 검색 문자열에 큰타옴표를 붙이거나 그 앞에 역슬래시(\)를 붙이십시오:

find . -name  \*.java

find 에 대한 인수는 옵션이기는 하지만, 검색 시작 위치를 지정하지 않은 경우에는 현재 디렉토리에서 기본적으로 검색이 시작됩니다. 옵션 사항이기는 하지만 테스트 조건을 지정하지 않은 경우에는 불완전하거나 선별되지 않은 결과값이 출력됩니다.
 
아래 3개의 find 명령어를 실행하면 똑같이 현재 디렉토리와 숨겨진 파일을 포함하는 모든 서브디렉토리의 모든 파일 목록이 검색됩니다:

find 

find .

find . -print

이는 –la 옵션을 가진 ls 명령어를 실행하는 것과 비슷합니다. 백업을 위해 위 명령어의 출력물에 전체 경로 이름이 포함되기를 원하는 경우라면 시작 디렉토리에 대한 전체 경로를 지정해야 합니다:

find /home/bluher -name \*.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/

...

또 한, 검색 문자열에 1개 이상의 시작 디렉토리를 지정할 수도 있습니다. 적정 권한을 가진 사용자로서 실행되는 경우, 아래 명령어는 모든 jar 파일을 찾기 위해 /usr, /home 및 /tmp 디렉토리 순서로 내려갈 것입니다:  

find /usr /home  /tmp -name "*.jar"

적정 권한이 없는 사용자라면 많은 시스템 디렉토리를 검색하기 시작할 때 다음과 같은 오류 메시지가 나올 수 있습니다:

find:  /tmp/orbit-root: Permission denied

다음과 같이 검색 문자열을 추가함으로써 불명확한 결과가 나오는 것을 피할 수 있습니다:

find /usr /home  /tmp -name "*.jar" 2>/dev/null

이렇게 하면 모든 오류 메시지가 널(null) 파일로 전송되기 때문에 보다 정제된 출력물이 제공됩니다.

기본적으로 find 명령어는 대/소문자를 구별합니다. 대/소문자가 구별되는 find에서는 -name 테스트를 대신해 -iname 테스트를 사용하십시오.

find downloads  -iname "*.gif"

downloads/.xvpics/Calendar05_enlarged.gif

downloads/lcmgcfexsmall.GIF
또한, 파일명 외에도 유형에 따라 파일을 검색할 수 있습니다. 예를 들어, 아래 명령어를 통해 디렉토리의 모든 서브디렉토리를 찾을 수 있습니다:
find . -type d          

아래 명령어를 사용하면 /usr 디렉토리의 모든 심볼릭 링크(symbolic link)를 찾을 수 있습니다:

find /usr -type l

위 명령어를 실행하면 3,000개 이상의 링크 목록이 나타날 것입니다. 슈퍼유저(root) 권한을 통해 아래 명령어 가운데 하나를 실행하면 /usr 디렉토리의 링크 목록과 이것이 가리키는 파일이 나타납니다:

# find /usr/bin  -type l  -name "z*" -exec ls  -l {} \;

lrwxrwxrwx 1 root root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh

lrwxrwxrwx 1 root root 5 Dec 12 23:17 /usr/bin/zless -> zmore

lrwxrwxrwx 1 root root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat
find /usr/bin -type  l  -name "z*" -ls

하지만, 보다 짧은 두 번째 명령어를 실행하면 디렉토리와 inode 정보를 가진 긴 파일 목록이 나올 것입니다. -exec 및 –ls 실행에 대해서는 후반부에서 다룰 것입니다

find가 찾을 수 있는 다른 파일 유형으로는 다음과 같은 것들이 있습니다

• b—block (buffered) special
• c—character (unbuffered) special
• p—named pipe (FIFO)
• s—socket

find 명령어의 시작점으로 루트를 사용하면 시스템 속도가 크게 느려질 수 있습니다. 반드시 명령어를 실행해야 하는 경우에는 사용량이 적은 시간대나 야간에 실행하는 것이 좋습니다. 아래 구문을 사용해 출력물을 파일로 보낼 수 있습니다.:

find  /   -print > masterfilelist.out

원치 않는 출력물을 대량 생산하는 find 명령어를 실수로 입력한 경우에는 CTRL-C를 누르기만 하면 가장 최근에 실행된 명령어가 중단됩니다.

여 러 파일 시스템을 갖춘 엔터프라이즈 네트워크에서는 특히 find 명령어가 검색한 파일을 제한하는 것이 좋습니다. 필요한 수 만큼 옵션 및 테스트를 사용함으로써 시스템 상의 로드를 줄일 수 있습니다. 이를 위해 가장 유용하게 사용할 수 있는 옵션은 –xdev와 -mount입니다. 이들 옵션은 find 명령어가 MS-DOS, CD-ROM 또는 AFS와 같은 다른 파일 시스템 상의 디렉토리로 내려가지 않도록 함으로써 검색 범위를 좁혀줍니다. 따라서, 시작 디렉토리와 동일한 유형의 파일 시스템으로 검색을 제한할 수 있습니다.

듀얼 부팅 시스템 사용자는 mount 명령어가 실행되는 경우에 이러한 옵션을 사용할 수 있습니다. Windows 파티션이 관련되어 있다고 가정하면, 아래와 같은 명령어를 통해 마운팅 할 수 있습니다.:

mount -t vfat  /dev/sda1 /mnt/msdos

여러분이 사용하는 실제 명령어는 시스템 설정 방법에 따라 달라집니다. df를 실행하거나 아래 명령어를 수행함으로써 파티션 마운팅 여부를 확인할 수 있습니다:

find /mnt/msdos  -name "*.txt" 2> /dev/null

MS Windows 파티션에서는 파일 목록이 길 수 밖에 없습니다. 이제부터는 -mount 또는 -xdev 옵션을 통해 아래 명령어를 실행하십시오:

find / -name  "*.txt" -mount 2> /dev/null

또는

find / -name  "*.txt" -xdev 2> /dev/null

아래 예에서와 같이 -fstype 테스트를 사용해 find 명령어에 찾고자 하는 파일 시스템을 명확하게 알려줄 수도 있습니다:

find / -name  "*.txt" -fstype vfat 2> /dev/null

시간 찾기

find 명령어는 시스템의 타임 스탬프를 토대로 파일 검색에 사용할 수 있는 여러 개의 옵션을 가지고 있습니다. 이러한 타임 스탬프로는 다음이 포함됩니다

mtime파일 내용이 마지막으로 수정된 시간
atime—파일을 읽기 또는 액세스한 시간
ctime—파일 상태가 변경된 시간

mtime 및 atime의 의미는 그 자체로 쉽게 알 수 있지만, ctime는 좀 더 설명이 필요합니다. inode는 각 파일에 메타 데이터를 가지고 있기 때문에 파일에 연결된 메타 데이터가 변경되면 inode 데이터도 변경됩니다. 파일에 대한 심볼릭 링크 생성, 파일에 대한 권한 변경, 파일 이동 등과 같은 다양한 작업으로 인해 이러한 메타 데이터 변경이 야기될 수 있습니다. 이러한 경우, 파일 내용에 대한 읽기나 수정은 수행되지 않기 때문에 themtime 및 atime은 변하지 않지만 ctime은 변합니다. 

이러한 시간 옵션은 각기 -n, n 또는 +n로 지정된 n 값을 함께 사용해야 합니다.

• -n은 n 이하를 반환
• +n은 n 이상을 반환
• n은 정확히 n에 해당되는 값을 반환

보다 명확한 설명을 위해 몇 가지 예를 살펴 보겠습니다. 아래 명령어는 최근 1시간 동안 수정된 모든 파일을 찾아줍니다:

find . -mtime -1

./plsql/FORALLSample

./plsql/RegExpDNASample

/plsql/RegExpSample

-1 대신 1을 가진 동일 명령어를 실행하면 정확하게 1시간 전에 수정된 모든 파일을 찾을 수 있습니다:

find . -mtime 1 

위 명령어는 정확하게 일치하는 값을 요청하기 때문에 모든 결과값이 나오지는 않습니다. 아래 명령어는 1시간 이전에 수정된 파일을 찾아줍니다:

find . -mtime +1 
기본적으로 -mtime, -atime 및 –ctime는 최근 24 시간에 대한 타임 스탬프입니다. 하지만, 뒤에 daystart 옵션을 붙이면 오늘을 시작으로 24시간 주기가 시작됩니다. 또한, mmin, amin 및 cmin을 사용하면 분 단위로 변경된 타임 스탬프를 찾을 수 있습니다.

여러분의 계정으로 로그인한 후 즉시 아래 명령어를 실행하면 최근 1분 내에 읽은 모든 파일을 찾을 수 있습니다:

find . -amin -1

./.bashrc

/.bash_history

./.xauthj5FCx1

find 명령어만으로 파일의 위치를 찾으면 메타 데이터의 일부인 파일의 액세스 시간이 변경된다는 사실에 유의하십시오.

-newer, -anewer 및 –cnewer 옵션을 사용하면 특정 파일과 비교해 수정 또는 액세스된 파일을 찾을 수도 있습니다. 이는 -mtime, -atime 및 –ctime과 비슷합니다.
 
• -newer : 보다 최근에 내용이 수정된 파일
• -anewer : 보다 최근에 읽기가 수행된 파일
• -cnewer : 보다 최근에 상태가 변경된 파일

마지막 tar 파일 이후로 어떤 방법으로든지 수정된 홈 디렉토리의 파일을 모두 찾으려면 아래 명령어를 사용하십시오:

find . -newer  backup.tar.gz

크기에 따른 파일 찾기

-size 옵션은 지정된 크기 기준에 부합하는 파일을 찾아줍니다. 크기가 5MB 이상인 모든 파일을 찾으려면 아래와 같이 하십시오

find / -size  +5000000c 2> /dev/null

/var/log/lastlog

/var/log/cups/access_log.4

/var/spool/mail/bluher

마 지막에 “c”를 붙이면 결과가 바이트 단위로 보고됩니다. 기본적으로 find 명령어는 512 바이트 블록의 수로 크기를 보고합니다. 또한, “c”를 “k”로 교체하는 경우에는 킬로바이트 수로, “w”를 사용하는 경우에는 2바이트 워드의 수로 결과를 표시할 수 있습니다.

-size 옵션은 모든 제로 바이트 파일을 찾거나 이들 파일을 /tmp/zerobyte 폴더로 이동하기 위해 자주 사용됩니다. 아래 명령어가 바로 이러한 연산을 수행합니다.

find test -type f  -size 0 -exec mv {} /tmp/zerobyte \;

-exec 옵션은 find 명령어가 만나게 되는 파일의 모든 쉘 명령어를 수행할 수 있도록 해줍니다. 후반부에서 이 옵션의 보다 다양한 사용 예를 확인할 수 있습니다. 중괄호를 사용하면 빈 파일 각각을 이동시킬 수 있습니다

또한, -empty 옵션을 사용하면 빈 파일을 찾을 수 있습니다.

find test -empty        

test/foo

test/test

권한 및 소유권에 따른 파일 찾기

find 명령어는 시스템 보안 모니터링을 위해 없어서는 안될 명령어입니다. 아래와 같이 기호법이나 8진법을 통해 사용 권한이 널리 열려있는 파일을 찾을 수 있습니다.

find . -type f  -perm a=rwx -exec ls -l {} \; 

또는

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

-rwxrwxrwx 1 bluher users 0 May 24 14:14 ./test.txt

위의 명령어나 아래 명령어의 경우 -exec ls –l을 수행하고 있기 때문에, 반환된 파일의 실제 사용 권한을 확인할 수 있습니다. 이 명령어는 “기타 사용자” 및 그룹이 모두 쓰기를 수행할 수 있는 파일을 찾아줍니다.

find plsql -type f  -perm -ug=rw -exec ls -l {} \; 2>/dev/null

또는

find plsql -type f  -perm -220 -exec ls -l {} \; 2>/dev/null 

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004 plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 plsql/FORALLSample/doc/readme.html

-rw-rw-rw- 1 bluher users 22647 Jan 12  2005 plsql/FORALLSample/src/config.sql

..
아래 명령어들을 실행하면 사용자, 그룹 또는 둘 모두가 쓰기 작업을 할 수 있는 파일을 찾을 수 있습니다  
find plsql -type f  -perm /ug=rw -exec ls -l {} \; 2>/dev/null, or,

find plsql -type f -perm /220 -exec ls -l {} \; 2>/dev/null

-rw-r--r-- 1 bluher users 21473 May  3 16:02 plsql/regexpvalidate.zip

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004 plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 plsql/FORALLSample/doc/readme.html

-rw-rw-rw- 1 bluher users 22647 Jan 12  2005 plsql/FORALLSample/src/config.sql

웹이나 기존 매뉴얼에는 아래 명령어로 나와 있을 것입니다.

find . -perm +220  -exec ls -l {} \; 2> /dev/null 

+ 기호는 / 기호와 동일한 역할을 하지만, 새로운 버전의 GNU findutils에서는 권장되지 않고 있습니다.

시스템에서 쓰기 가능한 모든 파일을 찾으려면 아래 명령어를 사용하십시오

find / -wholename  '/proc' -prune  -o  -type f -perm -0002 -exec ls -l {} \;

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004/home/bluher/plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 /home/bluher/plsql/FORALLSample/doc/readme.html

...

4 번째 사용 권한에 대해 앞으로 조금 더 다루겠지만, 마지막 필드의 “2”는 쓰기 비트로도 알려져 있는 파일 사용 권한의 “기타 사용자”에 해당됩니다. 우리는 설정된 다른 사용 권한이 무엇이든 관계 없이 기타 사용자를 위해 설정된 쓰기 권한을 가진 파일을 보고 싶다는 표시로 0002라는 사용 권한 모드 앞에 대시를 사용했습니다.

위의 명령어에서는 3가지 새로운 개념이 도입되었습니다. 패턴이 발견된 경우, – prune은 파일 패턴 “/proc”에서 -wholename 테스트를 사용함으로써 find 명령어가 이 디렉토리로 내려오지 않도록 막아줍니다. 불린 연산자 “-o”를 통해 find 명령어는 다른 디렉토리에서 명령어의 나머지 부분을 처리할 수 있습니다. 각 표현식 간에 가정된 암시적 and 연산자(-a)가 있기 때문에 좌측 표현식이 거짓(false)으로 평가된 경우 and 뒤에 나오는 표현식은 평가되지 않습니다. 따라서, -o 연산자가 필요합니다. 강제 우선 순위 적용을 위해 괄호를 사용하는 것처럼 find 명령어는 불린 연산자 -not, !,도 지원합니다.

시스템 관리자는 자주 find 명령어를 통해 해당 사용자나 그룹의 이름 또는 ID를 사용해 특정 사용자나 그룹의 정규 파일을 검색하고 있습니다:

[root] $  find / -type f -user bluher -exec ls -ls {}  \;

여기, 이러한 명령어의 출력에 대한 간단한 예제가 나와 있습니다:

4 -rw-r--r-- 1 bluher users 48  May  1 03:09  /home/bluher/public_html/.directory

4 -rw-r--r-- 1 bluher users 925 May  1 03:09 /home/bluher/.profile

또한, find 명령어를 사용해 그룹 별로 파일을 검색할 수도 있습니다:

[root] $ find /  -type f -group users
find / -type d -gid  100

이 명령어를 실행하면 그룹 ID 100이 소유하고 있는 디렉토리 목록이 나옵니다. 해당되는 uid 또는 gid를 찾기 위해 /etc/passwd 또는 /etc/group 파일에서 more 또는 cat 명령어를 실행할 수 있습니다

이 명령어는 알려진 특정 사용자 및 그룹에 관한 파일을 찾는 것 외에도 사용자나 그룹이 지정되지 않은 파일을 찾는 데도 유용합니다. 아래 명령어는 /etc/passwd 또는 /etc/group 파일에서 리스트를 가지고 있지 않은 파일을 식별합니다.

find / -nouser -o  -nogroup

위 명령어는 실제로 시스템 상에 결과를 제공하는 것은 아니지만, 파일을 이동한 후에 사용자나 그룹이 지정되지 않은 파일을 식별하는 데 사용할 수 있습니다

이제, 본 섹션 초반부에 언급한 별도의 높은 사용 권한 문제를 해결할 수 있게 되었습니다.

SGID 및 SUID는 UNIX 기반 운영 체제 상의 파일 및 디렉토리에 할당할 수 있는 특별 액세스 권한 플래그입니다. 컴퓨터 시스템 액세스에 있어 일반 권한을 가진 사용자가 일시적으로 높아진 권한을 가지고 바이너리 실행 파일을 수행할 수 있습니다.

find /  \( -perm -2000 -o -perm -4000 \) -ls

167901   12 -rwsr-xr-x   1 root     root         9340 Jun 16  2006 /usr/bin/rsh

167334   12 -rwxr-sr-x   1 root     tty         10532 May  4  2007 /usr/bin/wall

위 명령어에서 괄호가 escape 처리된 것을 볼 수 있습니다. 또한, 권한 간의 차이점을 확인할 수 있습니다. 첫 번째 파일에는 SGID 권한이 설정되어 있으며 두 번째 파일에는 SUID 권한이 설정되어 있습니다. 위 명령어의 마지막 연산은 -exec ls -dils 연산의 find 명령어와 유사합니다

find 명령어 제어

Linux 의 많은 명령어와 달리, find 명령어는 -r 또는 -R 옵션이 없이도 서브디렉토리로 내려가지 않습니다. 이는 기본적으로 지원됩니다. 하지만, 때에 따라 이를 제한하고 싶을 수 있습니다. 이럴 경우, -depth, -maxdepth 및 –mindepth 옵션과 –prune 연산이 유용합니다

-prune이 얼마나 유용한지는 이미 확인했기 때문에 이제는 -depth, -maxdepth 및 -mindepth 옵션에 대해 살펴보겠습니다.

-maxdepth 및 -mindepth 옵션을 사용하면 find 명령어를 통해 검색하고자 하는 디렉토리 트리의 수준을 지정할 수 있습니다. find 명령어가 단 한 수준의 디렉토리를 찾도록 하고 싶은 경우에는 maxdepth 옵션을 사용할 수 있습니다.

아래 명령어를 실행해 디렉토리 트리의 상위 3개 수준의 로그 파일을 검색하면 –maxdepth의 효과를 확인할 수 있습니다. 이렇게 하면 –maxdepth 없이 실행할 때 보다는 훨씬 적은 출력 결과가 나옵니다

find / -maxdepth 3  -name "*log"

또한, find 명령어에게 디렉토리 트리에서 최소 3개 수준까지 디렉토리를 검색할 것을 지시할 수 있습니다.

find / -mindepth 3  -name "*log"

-depth 옵션은 내용 평가에 앞서 디렉토리를 평가할 수 있도록 해줍니다. 아래 명령어는 한 예입니다.:

find -name "*test*" -depth

./test/test

./test

./localbin/test

./localbin/test_shell_var

./localbin/test.txt

./test2/test/test

./test2/test

./test2

find 명령어의 세계

지 금까지 find 명령어의 유용하지만 다소 혼란스러운 일부 기능에 대해 알아보았지만, find 명령어가 수행할 수 있는 추가 작업이 있습니다. 예를 들어, find 명령어가 기존 버전의 UNIX 및 기타 운영 체제와 호환 가능하도록 하고 여러 파일로 출력을 인쇄하도록 하는 등 연산을 수행할 수 있도록 하는 옵션이 있습니다. 본 자료를 읽은 다음에는 find 명령어에 대한 맨페이지(man page)를 이해할 수 있는 배경 지식을 갖추었을 것으로 생각하기 때문에 이 강력하면서도 유용한 툴을 직접 경험해 볼 것을 권합니다


Sheryl Calish는 Linux 전문 IT 컨설턴트입니다. Blue Heron Consulting을 거쳐 현재는 EquityBuild에서 IT 디렉터를 맡고 있습니다

반응형

'OS > UNIX 공통' 카테고리의 다른 글

ls 파일용량크기로 정렬하기  (0) 2015.02.08
세마포어에 대하여  (0) 2012.05.11
linux/unix date로 어제(yesterday) 날짜 출력  (0) 2010.05.05
Posted by [PineTree]