'UNIX'에 해당되는 글 5건

  1. 2009.10.13 [AIX] 명령어 모음
  2. 2008.08.20 UNIX 장비 시스템 정보 확인
  3. 2008.04.18 unix vi편집기
  4. 2007.11.26 unix 에서 find 용법
  5. 2007.11.01 ksh 에서 history 기능 사용 하는 방법

[AIX] 명령어 모음

[AIX] 명령어 모음

 

1. 제조사
- 회사명 = lsattr -El sys0
- 모델명 = prtconf (하드웨어config)
2. OS version
- 버전 = oslevel -r
3. CPU
- Arch = prtconf
- Hz = lsattr -El proc0 (단위 Hz)
- 개수 = lsdev -Cc processor|wc -l

4. Memory
- 용량 = lsattr -El sys0, prtconf
5. Virtual Memory
- 용량 = lsps -a
6. Internal Disk
- size = bootinfo -s hdisk(숫자) (Mb단위)
- 개수 = lsdev -Cc disk
7. External Disk (SSA)
- size = bootinfo -s hdisk(숫자) (Mb단위)
- 개수 = lsdev -Cc pdisk , lsdev -Ct hdisk
8. rootvg mirror(y/n)
- not mirror = lsvg rootvg (ACTIVE PVs = 1)
- mirror = lsvg rootvg (ACTIVE PVs = 2)
9. NIC
- 속도, 개수 = lsparent -Ck ent
10. 시스템에 장착된 부품들에 위치확인
- lscfg -vp
* 일반적 정보
prtconf = list system configuration
lscfg [-v] = devices (-v = verbose for microcode levels, etc)
lscfg -v = devices verbose (microcode level, firmware, etc)
lsdev -Cc adapter = adapter cards
lsdev -Cc disk = disks
lsdev -Cc processor = CPU s
lsattr -El sys0 = serial number, model number, memory
* AIX 관련 정보
oslevel = AIX OS level
instfix -i |grep ML = AIX maintenance level
lslpp -l = installed SW and levels
* Disk 관련 정보
lsvg -o = active volume groups
lsvg -p vgname = disk drives in VG
lsvg -l vgname = LV s in VG
lslv lvname = LV detail
lslv -l lvname = LV disk location
lspv = disks
lspv -l hdisk# = LV s residing on a disk

* Network 관련 정보
lsdev -Cc if = List network interfaces
netstat -rn = List network gateways
* lsdev -C 명령으로 해당 장치명을 알아낸후

lsattr -El 해당장치명 <enter>하시면 해당장치의 상세 정보를 알수 있습니다.
(예) lsattr -El mem0 이런식으로요.....
AIX에서는 CPU속도를 알려주는 명령이 없습니다. 그래서 명령외 다른 방법을 사용해야 합니다.
우선, uname 명령을 실행하면 다음 형태의 결과를 볼 수 있습니다.

#uname -m
xxyyyyyymmss

각 부분의 의미는 다음과 같습니다.
xx = 00
yyyyyy = 유일한 CPU ID
mm = Model ID <- CPU속도를 결정
ss = 00 (Submodel)

"uname -m"에서 나온 “mm"값을 가지고 찾는거죠...
시스템 기기정보
#prtconf
시스템 모델: IBM,9119-590
기계 일련 번호: 5115E9C
프로세서 유형: PowerPC_POWER5
프로세서 수: 4
프로세서 시계 속도: 1656 MHz
CPU 유형: 64-bit
커널 유형: 64-bit
LPAR 정보: 2 15E9C-lpar1
메모리 크기: 16384 MB
양호한 메모리 크기: 16384 MB
플랫폼 펌웨어 레벨: 사용할 수 없음
펌웨어 버전: IBM,SF225_095
콘솔 로그인: enable
자동 재시작: true
전체 코어: false
[AIX]자주쓰는 명령어들
****************** IBM bundles install. ****************************
#vi /usr/sys/inst.data/user_bundles/MyBundle.bnd
I:sysmgt.websm.security. // write the file which you want to install.
#smitty easy_install
// select Mybundle which you've made and Enter.
lslpp -Lb Mybundle // verify whethere bundle was installed successfully.
smitty list_installed // verify what is installed in server.
******************** AIX 용량 확장하기 ******************************
lsvg rootvg
chfs -a size=+100M /
******************** AIX 네트워크 설정하기 **************************
smit chgenet
smitty mktcpip -> N/W interface 선택
******************** 파일셋 및 fix(AIX) 설치 여부 확인 **************
lslpp -l bos.adt.base // 파일 셋 인스톨 여부 체크
instfix -i -k "IY4390" // fix 설치 여부 체크

******************** AIX 데몬 재시작 ********************************
refresh -s inetd
startsrc -g inetd
IBM filesets 설치

#oslevel -r // OS 레벨 확인
#instfix -i|grep ML // 파일셋 버전별 설치 현황
#instfix -icqk 5300-02_AIX_ML|grep :-: // 업데이트가 필요한 filesets
***************************** cd mount ************************************
#mount -vcdrfs -oro /dev/cd0 /mnt
#geninstall -d/dev/cd0 bos.alt_disk_install.rte // install fileset in cd.
lspv // see hard-drive information.
#bootlist -m normal hdisk1 hdisk13 // select which disk you want to boot
# bootlist -m normal -o // see which disk is on.
hdisk13

▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷
★★★ 명령어 ★★★
▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷▷
# lslpp -l | grep nim : 설치된 파일셋보기
# osrevel -r : o/s 버전보기.ml 포함
# lsconf | more : 서버 사양보기 (prtconf 와 동일)
# instfix -i | grep ML : O/S ML 정보 보기(All filesets for 5.3.0.0_AIX_ML were found.)
# export TERM=vt100 : display 의 화면모드 전환, smitty 시 F1,F2.. 키를 먹도록 한다.
# smit service_software : 서버에 설치된 파일셋보기
# smit compare_report : 서버에 부족한 파일셋 설치하기
# instfix -k IY58143 -d /dev/cd0 : cd에 들어있는 IY58143 을 찾아 설치한다.
# instfix -ik IY58143 : i 는 infomation 으로 설치는 하지않고, 정보를 본다
# bootinfo -y : h/w 적으로 64bit 가 지원되는지 확인
# bootinfo -K : o/s kernel 이 몇 bit 인지 확인
# alog -ot boot | more : booting 될때 에러가 있는지 로그점검 (smit alog 도 가능)
# lscft | grep ent : lan 카드 확인명령어
# stopsrc -s qdaemon / startsrc -s qdaemon : 데몬 내리고 올리기
# smit mlang : 언어선택하기
# ls -l /dev : 외부장치 디렉토리의 리스트확인
# lsdev -C -H : 설치된 장치리스트 보기
# lsattr -El fcs0 : 장치에 대한 설정정보 보기
# chvg -t2 rootvg : rootvg 를 t2로 바꾸어준다. max pp 갯수가 1016 -> 2032 로 증가
# lspv -p hdisk0 : pv의 lv 정보를 확인
# lsvg -l rootvg : vg 에 있는 lv의 정보를 확인
# lqueryvg -Atp hdisk0 : vgda(volum group discripter)를 보는데 vgda를 odm이 아닌 실제 disk에서 가져옴
# more /etc/filesystems : df 했을때 보여지는 filesystem 정보와 동일하다
# lscfg -vl fcs0 : fcs0의 상세정보 보기
# lsvg -p rootvg : 물리적으로 볼륨구성보기
# chvg -g volumegroup : 볼륨그룹을 재정리 해준다
# migratepv -l hdisk0 hdisk6 : hdisk0 의 모든데이터를 디스크단위로 hdisk6 로 이동한다.
# migratepv -l lv02 hdisk0 hdisk6 : hdisk0의 lv02를 hdisk6 에 이동(move)한다.
# chfs -a size =+500M /home : 파일시스템의 용량을 500M 추가한다
# chfs -a size = 1G /home : 파일시스템의 용량을 기존용량+추가용량 1GB로 증가시킨다
# df -k / df -m / df -g : 각 단위별로 파일시스템 보기
# du ./ | sort -r -n : 현재 디렉토리 아래에서 큰파일순으로 정렬한다
# # lslpp -L | pg : 설치된 모든 프로그램 보기.
www.redbooks.ibm.com 전세계 엔지니어들의 장애처리 경험
www.aixservice.net ibm 실장님이 운영하며 신규기술이 많음.
naver cafe 에 빠른 처리가잘되는 aix 카페
www.ibm.com/kr/education
# smitty tcpip 네트워크에 대한 설정을 해줄 수 있다
# startsrc -g tcpip, stopsrc -g tcpip //
#importvg -y testvg hdisk1 하드디스크 마운트하기.

# /usr/spool/cron/crontabs : 사용자별 클론 설정 위치
# /var/adm/cron/cron.deny, allow : 사용자별 클론 접근허용 및 거부 설정.
# lsps -a : 페이징 스페이스 정보 보기.
# fsck -y /dev/hd1 : 파일 시스템 체크
# mkuser user_name : 유저 생성.
# mkgroup group_name
# passwd user_name : 암호 설정.
# rmuser -p user_name : 유저 삭제.
# rmgroup group_name
# who /var/adm/wtmp or /var/adm/utmp : 사용자 접속 확인.
# who /etc/security/failedlogin : 접속 실패 확인.
# more /var/adm/sulog : su를 사용한 사용자 확인.
# last root, last reboot
# varyonvg vg_name : vg 활성화
# varyoffvg vg_name : vg 비활성화
# exportvg vg_name : vg 반출
# savevg vg_name : vg 백업
# extendvg pv_name : pv 확장
# reducevg pv_name : pv 삭제
# lsvg -l rootvg : vg에 대한 lv(Logical Volume) 확인
# mklvcopy lv_name hdisk_name

************ System Backup ***************************
# mkszfile
# cp /var/adm/ras/bosinst.data /root/
# mksysb /dev/rmt0
# tctl -f /dev/rmt0 rewind
# tctl -f /dev/rmt0.1 fsf 3
# restore -xqvf /dev/rmt0.1 /tmp/myfile
# backup -if /dev/rmt0 large_file
# mkdev -l rmt0 : 장치 상태 보기, 삭제
# rmdev -l rmt0

# smitty dev : serial 연결, Tape 특성, Device 설치

# errpt : 에러 보기(/var/adm/ras/errlog)
# errclear : 로그 삭제
# /usr/lib/errdemon : 에러로그 시작
# /usr/lib/errstop : 에러로그 중지
************** VG 미러링 ****************************
# mklv -y hd7 -t dump rootvg PP갯수 hdisk_name : dump device 생성
# snap -ac : dump file 생성

hdisk0 : rootvg hdisk1 : mirror
# extendvg rootvg hdisk1
# chvg -Qn rootvg
# mklvcopy hd1 2 hdisk1 : 미러링
# mklvcopy hd2 2 hdisk1
# mklvcopy hd3 2 hdisk1
# mklvcopy hd4 2 hdisk1
# mklvcopy hd5 2 hdisk1
# mklvcopy hd6 2 hdisk1
# mklvcopy hd7 2 hdisk1
# mklvcopy hd8 2 hdisk1
# mklvcopy hd9var 2 hdisk1
# syncvg -v rootvg : 새로생성한 미러 디스크를 sync 시킨다.
# bosboot -a -d /dev/hdisk1 : 부트 레코드및 장치 초기화.
# boolist -m normal hdisk0 hdisk1 : 부트 리스트를 초기화.
# shutdown -Fr
# lsvg -l rootvg : 확인

일단은 jdk1.4가 설치가 되었는지 확인하는 방법은
lslpp -L | grep Java14
그리고 jdk가 설치되는 위치는 버전별로 아래와 같습니다.
-------------------------------------------------------
- Java 1.4.x 32-bit /usr/java14
- Java 1.4.x 64-bit /usr/java14_64
- Java 1.3.1 32-bit /usr/java131
- Java 1.3.1 64-bit /usr/java13_64
- Java 1.3.0 /usr/java130
- Java 1.2.2 /usr/java_dev2
- Java 1.1.8 /usr/jdk_base
진단툴
/usr/lpp/diagnostics/bin/diagrpt

nmon # to see status of cpu and memory.
[AIX]Smitty jfs(저널 파일시스템)
특정 Volume Group 에 File System 만들기 [To make File system on AIX 5.3]
1. root 로 로그인한다.
[YOU HAVE NEW MAIL]
root@DMS:/ >
2. lspv 를 눌러 현재 Volume Group List 를 확인한다.
root@DMS:/ >lspv
hdisk0 00ceb31adae0d192 rootvg active
hdisk1 00ceb31ad4679f47 oraclevg active
3. 첫번째 디스크의 Volume Group 을 확인한다. (디스크 장애시 image 를 떠야하므로 free 영역을 그대로 두는게 좋다)
root@DMS:/ >lsvg rootvg
VOLUME GROUP: rootvg VG IDENTIFIER: 00ceb31a00004c0000000107dae0d65d
VG STATE: active PP SIZE: 128 megabyte(s)
VG PERMISSION: read/write TOTAL PPs: 546 (69888 megabytes)
MAX LVs: 256 FREE PPs: 349 (44672 megabytes)
LVs: 12 USED PPs: 197 (25216 megabytes)
OPEN LVs: 11 QUORUM: 2
TOTAL PVs: 1 VG DESCRIPTORS: 2
STALE PVs: 0 STALE PPs: 0
ACTIVE PVs: 1 AUTO ON: yes
MAX PPs per VG: 32512
MAX PPs per PV: 1016 MAX PVs: 32
LTG size (Dynamic): 256 kilobyte(s) AUTO SYNC: no
HOT SPARE: no BB POLICY: relocatable
4. 두번째 디스크의 Volume Group 을 확인한다. (54 GIGA 정도가 Free 상태로, File system 을 잡을 수 있음)
root@DMS:/ >lsvg oraclevg
VOLUME GROUP: oraclevg VG IDENTIFIER: 00ceb31a00004c0000000107dc4107fc
VG STATE: active PP SIZE: 128 megabyte(s)
VG PERMISSION: read/write TOTAL PPs: 546 (69888 megabytes)
MAX LVs: 256 FREE PPs: 425 (54400 megabytes)
LVs: 2 USED PPs: 121 (15488 megabytes)
OPEN LVs: 2 QUORUM: 2
TOTAL PVs: 1 VG DESCRIPTORS: 2
STALE PVs: 0 STALE PPs: 0
ACTIVE PVs: 1 AUTO ON: yes
MAX PPs per VG: 32512
MAX PPs per PV: 1016 MAX PVs: 32
LTG size (Dynamic): 256 kilobyte(s) AUTO SYNC: no
HOT SPARE: no BB POLICY: relocatable
5. 해당 Volume Group 이 어떠한 Type 으로 설정되어 있는지 확인한다. (jfs2 로 설정되어 있음)
root@DMS:/ >lsvg -l oraclevg
oraclevg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
oraclelv jfs2 120 120 1 open/syncd /oracle
loglv00 jfs2log 1 1 1 open/syncd N/A
6. smitty 를 이용하여 jfs2 파일 시스템을 만든다.
root@DMS:/ >smitty jfs2
6.1. 아래와 같은 화면이 나오면 첫번째 행을 선택한다.
Move cursor to desired item and press Enter.
Add an Enhanced Journaled File System
Add an Enhanced Journaled File System on a Previously Defined Logical Volume
Change / Show Characteristics of an Enhanced Journaled File System
Remove an Enhanced Journaled File System
Manage Quotas for an Enhanced Journaled File System
Defragment an Enhanced Journaled File System
List Snapshots for an Enhanced Journaled File System
Create Snapshot for an Enhanced Journaled File System
Mount Snapshot for an Enhanced Journaled File System
Remove Snapshot for an Enhanced Journaled File System
Unmount Snapshot for an Enhanced Journaled File System
Change Snapshot for an Enhanced Journaled File System
Rollback an Enhanced Journaled File System to a Snapshot
6.2. Unit Size 는 Free PPs 로 잡혀있는 단위와 같은 Megabytes 로 선택한다. (Tab 을 이용)
6.3. Number of units 는 Free PPs 에 잡혀있는 54400 과 같거나 작은 값을 입력한다.
6.4. MOUNT POINT 는 Mount 하고자 하는 폴더명을 /oracledata 와 같은 형식으로 입력한다.
6.5. Mount AUTOMATICALLY at system restart 는 Tab 을 이용하여 yes 로 변경한다.
6.6. Enter 를 눌러 작업을 종료한다.
Add an Enhanced Journaled File System
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
Volume group name oraclevg
SIZE of file system
Unit Size Megabytes +
* Number of units [] #
* MOUNT POINT []
Mount AUTOMATICALLY at system restart? no +
PERMISSIONS read/write +
Mount OPTIONS [] +
Block Size (bytes) 4096 +
Logical Volume for Log +
Inline Log size (MBytes) [] #
Extended Attribute Format Version 1 +
ENABLE Quota Management? no +
7. mount all 을 눌러 모든 폴더를 mount 시킨다.
root@DMS:/ >mount all
mount: 0506-324 Cannot mount /dev/hd1 on /home: The requested resource is busy.
mount: 0506-324 Cannot mount /proc on /proc: The requested resource is busy.
mount: 0506-324 Cannot mount /dev/hd10opt on /opt: The requested resource is busy.
mount: 0506-324 Cannot mount /dev/cd0 on /cdrom: The device is not ready for operation.
mount: 0506-324 Cannot mount /dev/fslv00 on /imsi: The requested resource is busy.
mount: 0506-324 Cannot mount /dev/oraclelv on /oracle: The requested resource is busy.
8. df -k 를 눌러 제대로 잡혔는지 확인한다.
root@DMS:/ >df -k
Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/hd4 262144 243224 8% 2202 4% /
/dev/hd2 1966080 162960 92% 39089 49% /usr
/dev/hd9var 131072 122260 7% 390 2% /var
/dev/hd3 524288 522932 1% 56 1% /tmp
/dev/fwdump 393216 392828 1% 4 1% /var/adm/ras/platform
/dev/hd1 131072 130680 1% 11 1% /home
/proc - - - - - /proc
/dev/hd10opt 131072 3868 98% 3823 77% /opt
/dev/fslv00 4194304 2520496 40% 49 1% /imsi
/dev/oraclelv 15728640 679500 96% 20075 12% /oracle
/dev/fslv01 55705600 55696768 1% 4 1% /oracledata

UNIX 장비 시스템 정보 확인

1 HP-UX 시스템 사양보기

1) SAM 실행

2) Performance Monitors 선택

 

3) System Properties 선택

 

4)    Tap키를 이용해 필요한 데이터 확인

2 AIX 시스템 사양보기

    1) command prompt에서 prtconf 입력

   

3 Solaris, SunOS 시스템 정보보기

1) command prompt 에서 /usr/platform/sun4u/sbin/prtdiag –v 실행   

unix vi편집기

1) Vi 시작, 종료

먼저 vi를 실행시키는 것과 종료시키는 것에 대해 살펴보자.

vi를 실행시키기 위해서는 쉘 상태에서 vi라고 입력하면 된다.

$ vi file name

먼저 vi를 실행시키면

$ vi

기존의 화면은 사라지고 새로운 하나의 화면이

나오게 된다. 이 화면이 바로 vi 편집기의 기본 화면이다. 이 화면을 보면 각 줄의 처음에는 틸다(~)가 나온다. 틸다가 있는 줄 다음부터는 아무런 내용도 없다는 것을 뜻한다. 그리고 커서는 맨 첫줄의 왼쪽에서 깜박거리고 있다.

~
~
~
~
~
~
~
~
~

이제 vi 편집기에서 빠져 나가기로 하자. 현재 상태에서 콜론(:)을 입력해보자.

~
~
~
~
~
~
~
:

그러면 화면 하단에 콜론(:)이 나타날 것이다. 이제 이곳에서 vi 편집기의 명령을 쓸수가 있다. 이곳에서 q를 입력한 다음 [Enter]를 치면 vi를 종료한다.

~
~
~
~
~
~
: q
$

2. Vi내에서의 이동

vi 편집기안에서 커서를 이동하는 것에 대해 알아보자. 우리가 일반적으로 알고 있는 방법과는 전혀 다른 방법으로 UNIX의 vi에서는 작업한다는 것을 여러분은 바로 느낄 수가 있을 것이다.

이제 하나의 test 파일을 가지고 vi 편집기에서 직접 이동하는 것을 연습해 보도록 하겠다.

1) 간단한 이동

홈 디렉토리의 .csrhc 파일은 중요한 파일이므로 이 파일은 놔두고, 그 파일을 test라는 파일로 복사하여 사용하여보자.

$ cp .cshrc test

$ vi test

vi를 실행시키면 아래와 같은 새로운 화면이 나타난다.

# @(#)cshrc 2.0 Apr 1 1995 TriGem

umask 022

set path=(/usr/sbin /usr/ccs/bin /usr/bin /usr/ucb /sbin /etc \

/usr/X11R5/bin /usr/openwin/bin /usr/local /usr/local/bin \

/usr/lib/nis /opt/SUNWspro/SC3.0.1/bin .)

if ( $?prompt ) then

set history=32

endif

set filec

setenv DISPLAY unix:0

setenv OPENWINHOME /usr/openwin

setenv EDITOR /usr/ucb/vi

"test" 42 행, 1409 문자

맨 아래 하단에 있는 ["test" 42 행, 1409 문자]는 test라는 파일에 대한 간단한 정보를 나타내고 있다. 처음 나오는 것은 파일의 이름을 두 번째는 test 파일의 내용이 총 42줄로 되어 있다는 것을 마지막으로 1409 문자는 test 파일에는 총 1409자의 문자가 들어있다는 것을 뜻하는 것이다.

이제 vi안에서 커서를 어떻게 이동하는 가를 알아보자.

    [H] : ← 왼쪽으로 한 문자 이동
    [J] :↓ 아래로 한 줄 이동
    [K] :↑ 위로 한 줄 이동
    [L] :→ 오른쪽으로 한 문자 이동

    위 4개의 커서 제어키를 이용하여 왼쪽, 오른쪽, 위 그리고 아래로 이동 할 수 있는 것이다.

2) 줄의 처음과 마지막으로 이동

이번에는 현재 커서가 위치한 줄의 처음과 끝으로 이동하는 것에 대해 알아보겠다.

    [0] : 그 줄의 처음으로 이동
    [Shift]+[4]: 그 줄의 끝으로 이동

그리고 0은 커서가 위치한 줄의 시작 부분인 처음으로 이동, $는 그 줄의 끝으로 이동하게 해준다.

3) 단어 단위로 이동

단어 단위로 이동하기 위해서는 -h, j, k, l- 키를 가지고 이동하는 것보다는 다음의 w와 b로 이동하는 것이 더욱 효율적이다.

    [w] : 다음 단어의 첫 글자로 이동
    [b] : 앞 단어의 첫 글자로 이동
    [W] : 다음 단어의 첫 글자로 이동 (띄어쓰기를 기준으로)
    [B] : 앞 단어의 첫 글자로 이동 (띄어쓰기를 기준으로)

4) 페이지 단위 이동

    [Ctrl]+[F] : 한 페이지 뒤로 이동
    [Ctrl]+[B] : 한 페이지 앞으로 이동
    [Ctrl]+[D] : 반 페이지 뒤로 이동
    [Ctrl]+[U] : 반 페이지 뒤로 이동
    [G] : 파일의 마지막으로 이동
    5[G] : 5번째 줄로 이동

3. Vi 입력, 추가

이동하는 것에 대해 알아보았다. 이것들을 충분히 연습하여 vi에서 커서의 이동을 자유 자래로 할 수 있도록 연습하기 바란다.

이번 절에서는 vi에서 어떻게 텍스트를 입력하고 수정하는지를 알아보기로 하자.

1) 입력모드 들어가기

vi는 일반적인 워드프로세서와는 좀 색다른 방법으로 텍스트를 입력한다. 예를 들어 설명하기로 하자. 일단 존재하지 않는 새로운 파일 exam으로 작업해 보도록 하겠다.

$ vi exam

이곳에서 다음과 같은 새로운 텍스트를 입력해 보기로 하자.

This is a exam file.

I'm kkjjmm.

It is the KOREA.

텍스트를 입력하기 위해 'T'를 치면 UNIX는 '삑' 소리를 내면서 입력되지가 않는다. UNIX는 텍스트를 입력하기 위한 특별한 명령이 있다.

    [i] : 삽입 모드로 들어가기
    [a] : 파일에 텍스트 삽입(부가모드)
    [o] : 현재 줄 아래에 새로운 줄 만들기
    [O] : 현재 줄 아래에 새로운 줄 만들기

위 4가지 입력 모드로 들어가기 위한 명령들이다. 이제 텍스트를 삽입하기 위해 ?를 입력한 다음 텍스트를 입력하면 vi 화면에 글자들이 나타나질 것이다.

This is a exam file.

I'm kkjjmm.

It is the KOREA.

이것으로 텍스트를 입력할 수 있었다. 이제 그만 텍스트 입력을 끝내기로 하자. 입력모드에서는 저장하거나 끝내는 작업을 할 수 없다. 이러한 명령들은 명령모드에서만 작업을 할 수 있다. 처음에 vi를 시작하면 그때의 상태가 명령모드로 되어있다.

그럼 명령모드로 들어가기 위해서는 어떻게 해야 할까?

현재 상태에서 [Esc]를 누르면 입력모드에서 빠져나와 명령모드의 상태가 된다. 한번 더 [Esc]를 누르면 '삑' 소리가 들릴 것이다.

    [Esc] : 삽입모드에서 명령모드로 전환

2) 텍스트 추가하기

입력한 내용을 자세히 보면 수정해야 할 곳이 있다. 먼저 첫 번째 줄에서 처음과 마지막에 *를 추가하고, 두 번째로 exam을 example로 바꾼 다음 마지막으로 맨 아래 줄에

It is a vi editor.

라고 추가하고자 한다.

This is a exam file.

I'm kkjjmm.

It is the KOREA.

그럼 'T'자 앞에 '*'를 추가하기 위해서는 커서를 'T'자에다 놓고 [i]로 삽입모드로 들어간 다음 '*'를 추가하고 [Esc]로 명령모드로 돌아온다. 그리고 'file.' 다음에 *를 추가하기 위해 '.'에 커서를 놓고 [a]로 부가모드로 들어간 다음 '*'를 추가한다. 이때 [i]를 눌렀을때와는 한가지 다른점이 있는데 그것은 입력모드와는 다르게 부가모드는 커서가 다음 칸으로 이동한 다음 그곳에서부터 텍스트를 추가할 수 있다는 것이다. 이렇듯 그 줄의 맨 마지막에 텍스트를 추가하기 위해서는 [a]의 부가모드가 필요하다.

두 번째로 커서를 이동하여 [a]나 [i]로 'exam'을 'example'로 바꾸어준다.

마지막으로 제일 하단에 텍스트를 추가하기 위해서는 커서를 마지막 줄로 이동시킨다음 [o]를 누르면 현재 줄 아래에 새로운 줄이 하나 생긴다. 이곳에서 새로운 줄을 추가시킨다.

이제 작업을 그만하고 vi를 종료시키도록 하자. ':q'를 누르면 vi는 다음의 메시지를 출력시켜준다.

변경된 부분이 보관되지 않았음 (:quit! 무시)

위의 메시지는 파일을 저장하지 않고 끝내려고 한다는 것이다. 저장하지 않고 빠져 나가려면

: q!

를 치면 된다. 파일을 저장하려면 콜론(:)을 누르고 [w]를 누르면 커서가 위치하고 있는 곳의 바로 앞까지가 exam이라는 파일로 저장이 된다.

    [w] : 텍스트 저장

4. 텍스트 삭제

바로 조금 전에 작업한 exam 파일을 가지고 vi의 새로운 방법을 연습해 보도록 하겠다.

vi에서 텍스트를 삭제하기 위해서는 다음의 명령어를

    [x] : 한 글자 삭제
    [d][w] : 한 단어 삭제
    [D] : 한 줄 삭제
    [d][d] : 한 줄 삭제
    3[d][d] : 3줄 삭제후 버퍼에 저장

삭제한 것을 취소하거나 변경한 것을 취소하기 위해서는,

    [u] : 변경 내용 실행 취소
    [U] : 현재 라인의 모든 변경 내용 취소

이러한 명령들을 입력하면 된다.

*This is a example file.*

I'm kkkjjjmm.

It is the KOREA.

It is a vi editor.

위에서 네 번째 줄의 "It" 를 삭제해 보도록 하자. 그러면 커서를 이동하여 삭제하고자 하는 글자에 위치시킨 다음 [x]를 누르면 누를 때마다 한 글자씩이 지워지며 뒤의 글자들이 한자씩 왼쪽으로 이동한다.

이번에는 한 단어씩을 지워보도록 하자. [d][w]를 한 번 누르면 "is"가 지워지고 또 한번 누르면 "the"가 지워진다. 이 상태에서 [u]를 눌러보자. 어떻게 되는가? 방금 전에 삭제한 "the"가 다시 화면에 나타날 것이다. 다시 한 번 [u]를 누르면 이번에는 지워질 것이다. 이 명령은 방금 전에 실행한 명령을 취소하는 기능을 가지고 있기 때문에 이런 현상이 나타나는 것이다.

이번에는 [U]를 누르면 현재 라인에서 삭제한 모든 문자가 다시 복구되어질 것이다. 다시 [U]를 누르면 어떻게 되는가? 변하는 것이 없을 것이다.

그럼 다시 "It is the"를 삭제하고, 아래 줄로 이동한 다음 [U]를 눌러보자. 이번에는 삭제한 문자들이 복구가 되지 않을 것이다. 이것으로 [U] 명령은 현재 줄에서만 적용이 되고 줄이 바뀌면 제 기능을 발휘하지 못한다는 것을 알 수 있을 것이다.

*This is a example file.*

I'm kkkjjjmm.

KOREA.

It is a vi editor.

이번에는 [D]를 누르면 어떤 변화가 있는가? 이것은 현재 커서가 위치한 곳부터 그 줄의 끝가지를 지워준다는 것을 알 수 있을 것이다.

다음으로 커서를 마지막 줄의 "v"에 위치시킨 다음 [d][d]를 누르면 그 줄 전체가 삭제된다는 것을 볼 수 있을 것이다.

[U]를 눌러서 복구시킨 다음 커서를 "e"에 놓고 [Shift]+[~]를 누르면 "E"로 바뀌는 것을 볼 수가 있다. 계속해서 [Shift]+[~]를 누르면 "editor"가 "EDITOR"로 바뀐다. 다시 커서를 앞으로 이동해서 [Shift]+[~]를 누르면 다시 소문자로 바뀐다는 것을 확인할 수 있을 것이다. 즉, 대소문자를 변환하기 위해서는

    [Shift]+[~]: 대소문자 변환

5. 텍스트의 검색

6장에서 pg 명령어에 대해 공부할 때 /kkkjj라고 하면 이 패턴이 들어있는 라인으로 이동하던 것을 기억하고 있을 것이다. vi에서도 어떤 패턴을 검색할 수 있는데, 방법은 pg에서와 같다.

/pattern

test라는 파일의 명령모드 상태에서 /bin이라고 입력한 다음 Enter를 치면 커서가 bin이라는 패턴이 있는 곳으로 이동하여 있을 것이다.

/

다음의 bin이라는 패턴으로 이동하기 위해서는 //를 입력하면 된다.

현재 커서가 있는 곳에서 앞으로 검색하기 위해서는 다음과 같이 하면 된다.

?pattern

?set를 입력하면 set이라는 패턴을 현재 커서가 위치한 곳에서 앞으로 검색하여 이동한다.

?

앞으로 검색을 계속하려면 ?를 입력하면 간단히 할 수 있다.

    [n] : // 또는 ??와 같은 기능
    [N] : 현재 찾기 진행 방향의 반대로 검색

텍스트를 편집하는 경우에는 각 줄에 줄 번호가 있으면 편리할 것이다.

: set number

와 같이 하면 화면 왼쪽에 숫자가 나올 것이다. 이것은 줄 번호를 나타내는 것이다.

6. 텍스트의 복사와 이동

편집기에서 작업 중에서 중요한 것은 텍스트의 편집일 것이다. 특정한 단어나 라인을 복사하여 다른 곳에 쓰거나 이동하는 것 등은 자주 쓰이는 것이다. 텍스트를 복사하거나 이동할 때는 지금까지의 명령어와는 좀 다른 방법으로 한다.

1. 작업하려고 하는 텍스트를 복사하거나 삭제한다.
2. 텍스트를 복사하거나 이동하고자 하는 곳으로 커서를 이동한다.
3. 1에서 복사하거나 삭제한 텍스트를 커서가 있는 곳에 옮긴다.

복사하거나 삭제하면 vi는 이것을 버퍼(임시 기억 장소)에 복사한다. 우리는 이제 버퍼에 있는 텍스트로 작업을 하는 것이다.

여기에서 사용되는 명령어를 보면

    [y][w] : 단어 복사
    [y]$ : 줄의 끝가지 복사
    [Y] : 현재 줄 복사

위와 같다. 3yw라고 하면 현재 커서가 있는 곳에서부터 3단어를 복사하라는 것이다.
y)는 커서가 위치한 문장의 끝까지 복사, y}는 문단의 끝까지 복사하라는 것이다.
3Y라고 하면 3줄을 복사하라는 것이다.

이제 이렇게 복사한 텍스트들을 원하는 장소에 옮겨보기로 하자.

텍스트를 옮기고자 하는 곳으로 커서를 이동한 다음

    [p] : 커서가 위치한 곳에서 오른쪽으로 텍스트를 붙인다.
    [P] : 커서가 위치한 곳에서 왼쪽으로 텍스트를 붙인다.

p를 누르면 텍스트를 옮길 수가 있다.

만약 줄 단위로 복사하였다면 p를 누르면 현재 커서가 위치한 곳의 아래에 텍스트가 위치할 것이다.

unix 에서 find 용법

* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
find . -prune ...

- 퍼미션이 777 인 파일 찾기
find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
find / -perm -2 -print | xargs chmod o-w
또는
find / -perm -2 -exec chmod o-w {} ; -print | xargs ls -l | more

- 사용자이름과 그룹이름이 없는 파일 찾기
find / ( -nouser -o -nogroup ) -print | more

- 빈 파일(크기가 0 인 파일) 찾기
find / -empty -print | more
또는
find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
find . -type d ...

- root 권한으로 실행되는 파일 찾기
find / ( -user root -a -perm +4000 ) -print | xargs ls -l | more

- 다른 파일시스템은 검색하지 않기
find / -xdev ...

- 파일 이름에 공백이 들어간 파일 찾기
find / -name "* *" -print

- 숨겨진(hidden) 파일을 찾기
find / -name ".*" -print | more

- *.bak 파일을 찾아 지우기
find / -name "*.bak" -exec rm -rf {} \;

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \;

find에 대한 참고문

find는 유닉스 및 리눅스 환경에서 중요한 유틸리티 중 하나이다. find는
파일의 이름부터 시작해서 수정 시간에 이르기까지 주어진 파라미터들과
일치하는 파일들을 찾아준다.

여기에서는 find에 대해 일부분만 다룬다. 조금더 알고싶은 유저는 한빛미디어
"유닉스 파워툴"을 참조하시기 바란다.

find의 기본문법

find path operators

path는 경로이다. 이 부분에 대해선 다음부분에서 약간 더 자세하게
설명할 것이다.
operators 는 연산자이다. 쉽게 풀이하자면 옵션인 셈이다. 여기에 들어갈
수 있는 것은 지금부터 소개할 것이다.

-name filename

우리가 가장 일반적으로 사용하는 옵션이다. filename에는 와일드 카드(별표)
가 들어갈 수 있지만 쉘이 변환하지 않도록 인용부호 쿼트(")로 둘러싼다

-perm mode

주어진 액세스 모드를 가진 파일을 찾는다. 액세스 모드는 8진수 값을 갖는다.
뒤에서 다시 설명한다

-type c

지정된 타입에 관해서 파일을 찾는다. c는 한글자로 된 코드이다. 예를 들면,
f는 일반 파일, b는 블록 특수 파일, l은 심볼릭파일을 나타낸다. 뒤에서 다시
설명한다.

-user name

이 옵션은 name에 해당하는 사용자 파일을 찾는다. name에는 사용자 id뿐만 아니라
사용자의 UID도 들어갈 수 있다.

-group name

이 옵션은 name에 해당하는 그룹의 파일을 찾는다. name에는 그룹명 뿐만 아니라
GID가 들어갈 수도 있다.

-size n

해당되는 사이즈의 파일을 찾는다. n은 블록길이의 파일을 찾는다. 한 블록은 512와 같다.
+n 이란 표시가 들어가면 n 블록보다 더 긴 파일을 찾는다라는 뜻이다. 파일이 클때
유용하다. nc라는 표현은 n 문자 길이의 파일들을 찾는다는 의미이다. ++nc는 무엇을
뜻할까? 뒤에서 다시 다룬다

-inum n

inode 번호가 n인 파일을 찾는다. 그다지 자주 사용되는 옵션은 아니여서 자세한
설명은 요약한다.

-atime n

n일 전에 액세스한 파일들을 찾는다. +n은 n일 이전에 액세스한(즉 n일 동안 액세스
하지 않은)파일들을 찾는다는 의미이다. 그러면 -n은 무엇을 의미할까? (즉, n일 동안
액세스한) 파일들을 찾는다" 의미이다. 뒤에서 다시 언급한다

-mtime n

파일의 내용이 수정된 시간을 검사한다는 것을 제외하고는 atime과 유사하다.

-ctime n

inode의 마지막으로 변경된 시간을 확인한다는 것을 제외하고는 atime과 유사하다.
"변경되다"라는 것은 파일이 수정되거나 그 특성 중의 하나가 변경되었다는 것(예를
들면, 그 소유자)을 의미한다.

-newer file

주어진 file보다 더 최근에 수정된 파일을 찾는다.

그런데 여기까기 find의 옵션을 살펴 보았는데 때때로 여러분은 조건을 만족하는
파일을 찾기 원할 것이다. 이럴때 쓰는 연산자가 있다. 다음이 그 연산자이다.

operator1 -a operator2

and 연산에 해당한다. -a는 생략이 가능하다. 두개의 검색 패턴이 같이 쓰여지면
find는 2개 모두와 일치하는 파일들을 원하는 것으로 가정한다.

operator1 -o operator2

or 연산에 해당한다. 둘 중 하나가 속하는 파일을 찾는다.

! operator

not 연산에 해당한다. operator에 해당하지 않는 파일들을 찾는다.

\(expression\)

논리 우선순위를 의미한다. 복잡한 표현식에서 위와 같이 지정해 주면 이 부분을
나머지 부분보다 빨리 계산한다. 여기서 (를 \( 로 표현했는데. 쉘이 해석할 수
있기 때문이다. php를 사용해 보신분이라면 무슨 얘기인지 대충 감 잡으셨을 것이다.

이번 부분은 find가 파일들을 찾았을때의 행위를 지정하는 그룹의 연산자들이다.

-print

파일의 이름을 표준출력으로 출력한다. 뒤에서 조금 더 다룬다..

-exec command

찾은 파일들을 command로 처리한다. command에서 찾은 파일의 경로명을 포함
시키려면 중괄호를 사용한다 {} command는 명령을 실행시키고 난 뒤에는 반드시
백슬래시와 세미콜론을 사용한다. (\;)

-ok command

기본적으로 -exec 옵션과 같다. 그러나 해당 command를 실행하기 전에 명령을
실행할지에 대해 물어본다. 일반적으로 find를 테스트하는 데 많이 쓰인다고 한다.

위 옵션은 가장 일반적인 옵션들이지만 때때로 막강한 시스템 관리자들은 추가 또는
삭제하여 사용하기도 하니 여러분의 시스템에서 man find를 하게 되면 더 많은 옵션을
볼 수 있을 것이다.

1. 깊은 디렉토리 파고 들어가기

find의 가장 분명한 용도는 오래되고 큰 자료를 찾는 것이다. 또는 사용되지 않는
파일들의 위치를 찾아내는 능력이다. 그러나 근본적으로 가장 중요한 find의 특징은
서브 디렉토리로 내려가는 것이다.

보통 쉘은 인자 목록을 명령어에 제공해 준다. 그것은 UNIX 프로그램들에게 디렉토리명이
아닌 파일명들이 주어지는 이유이다. 단지 몇몇 프로그램들만이 디렉토리 이름을 받아서
서브디렉토리의 이름을 받아서 검색해서 내려갈 수 있다. find, tar, du, 그리고 diff 같은
프로그램이 그렇게 한다. chmod, chgrp, ls, rm 그리고 cp의 몇몇 버전들도 -r이나 -R
옵션이 주어질 때는 그럴 수 있다.

일반적으로는 대부분의 명령어들은 디렉토리 구조를 완전이 이해하지 못하며 쉘이 와일드
카드를 디렉토리 명으로 확장해 주는데 의존한다. 그러므로 어떤 디렉토리 그룹에서 .o로
끝나는 모든 파일들을 삭제하려면 다음과 같이 입력할 수 있다

find *.o */*.o */*/*.o

이렇게 하는 것은 입력하기 귀찮을 뿐 아니라 검색하는 모든 파일들을 찾을 수 없을지도
모른다. 쉘은 어떤 맹점이 있다. 점으로 시작하는 이름을 가진 디렉토리 내의 파일들은
찾을 수 없을 것이다. 그리고 */*/*/*.o 로 찾아지는 파일들이 있다면 삭제되지 않을 것이다.

또 다른 문제점은 위와 같이 입력하게 되면 Arguments too long이라는 에러 메시지를 내 뱉는다.
이것은 여러분이 입력한 와일드 카드를 쉘이 너무 많은 인자들로 확장했음을 의미한다.

find는 이런 문제점에 대한 해결책이다.

find의 가장 간단한 예는 다음이다

find . -print

find의 첫번째 인자는 디렉토리 또는 파일들의 경로이다. 위의 예제는 해당 디렉토리의
모든 파일들을 찾아준다. 경로명 뒤의 인자들은 항상 - 부호 (하이픈또는 대시라고 부른다)가
붙게 된다. 이것에 유의하기 바란다. 그리고 이 인자는 find가 무엇을 찾았을 때 어떤 행동을
취하는 가에 대해 명시한다. 그리고 다른 말로 이것은 검색 연산자들이다. 이경우엔 파일명이
출력된다. 특정 경로 이외에 C쉘에서는 틸드(~)도 사용할 수 있다. 예를 들어본다

find ~ ~barnett /usr/local -print

그리고 만약 따분하다면 다음과 같이 명령을 내릴 수도 있다

find / -print

위의 예제는 디스크에 있는 모든 파일들을 검색한다. 이 예제는 자신이 쓰는 워크스테이션에선
상관 없겠지만 여러 사람이 쓰는 웍 스테이션이나 서버에서는 범죄 행위일 정도로 디스크를
공회전 하게 낭비한다. 왠만해선 참아주기 바란다. 그러나 정말 필요하다고 생각될 시엔
/* 를 사용해 주기 바란다.

find는 결과를 표준 출력(stdin)으로 뿌리게 되니 발견한 파일의 목록을 다른 명령어로 보낼 수 있다.
이 기능을 사용한 한가지 방법은 치환이다. 다음 예제를 보자.

ls -ld 'find . -print'

find의 명령어의 실행 결과 출력이 역 인용부호 전체를 대신한다. ls는 find의 결과를 볼뿐 find
가 사용되었다는 것을 모른다. 또 다른 명령어는 xargs를 사용하는 방법이 있으나
여기에서 더 다루지 않겠다. 관심있는 유저는 한빛미디어 "유닉스 파워툴"을 보기 바란다.

2. -print 를 잊지 말자..

가끔 나는 find에 -print를 붙이는 것을 잊는다. 이것을 붙이지 않으면 검색결과가 출력되지 않는다.
(물론 GNU 버전에서는 그렇지 않으나 GNU 버전이 아닌 find에서는 꼭 붙여주어야 한다. 일부 버전에서는
-ls도 사용한다)
이것은 오래된 시스템 관리자도 가끔 잊고 초보 사용자들이 가장 잘 실수하는 내용 중 하나이니 조심하자
그리고 일부 버전은 -print를 추가해 주기도 하지만 기대해선 안된다.

3. 특정한 이름을 가진 파일 찾기

find 명령을 내릴때 메타 문자를 사용할 수 있는데 정규 표현식(grep과 같진 않다)를 사용할때 -name
연산자의 인자로 사용해서 그것들이 변경되지 않고 find로 넘겨지게 하려면 인용 부호로 감싸야 한다.
여기서 인용부호로는 어떤것을 사용해도 관계 없다.

find . -name \*.o -print
find . -name '*.o' -print
find . -name "[a-zA-Z]*.o" -print

파일 경로의 디렉토리들은 -name 연산자와 일치하지 않고 경로의 마지막에 있는 이름만이 일치한다.
예를 들어, 위의 명령어들은 ./subdir/afile이란 경로명과 일치하진 않지만 ./subdir/prog.o와는 일치한다.

경로의 중간에 있는 디렉토리과 일치하는 방법이 있다.

alias ff "find . -name '*\!{*}*' -ls"

파일이나 디렉토리의 이름을 넘겨주면 이 앨리어스는 그 인자를 포함하는 모든 파일이나 디렉토리
이름의 목록을 출력할 것이다.

4. 오래된 파일 찾기

7일된 파일을 찾고 싶으면 -mtime 연산자를 사용하면 된다

find . -mtime 7 -print

또 다른 방법은 시간의 범위를 지정하는 것이 있다.

find . -mtime +6 -mtime -8 -print

mtime은 파일의 최종 수정 시간이다. 사용되지 않은 파일을 찾아보려면 -atime 인자로 액세스 시간을 확인
하면 된다. 30일 이상 읽혀지지 않은 파일을 찾으려면 다음과 같이 하면 된다.

find . -type f -atime +30 -print

find 명령어가 디렉토리의 시간을 수정하기 실제로 액세스 되지 않은 디렉토리를 찾기란 어렵다. 각 파일과
관련된 연관된 또 하나의 시간이 있는데. ctime이라 불리는 inode 변경 시간이다. 그러나 여기에선 더 이상
자세하게 다루지 않는다.

5. find 검색의 최고봉이 되어보기

find는 확실히 까다롭다. 그러나 그 능력을 자유롭게 다루면 그 까다로움에 감사하게 될 것이다.(아직 필자는
그런 능력을 가지고 있지 않다)

find의 명령어들은 명령행의 복잡도와 상관없이 실제로는 위와 같은 것의 변형들일 뿐이다. 많은 다른 이름을
명시할 수 있고 오래된 파일들을 찾을 수 있다. 그 복잡함에 관계없이 실제로는 시작점이 어디이고 어떤
파라메터를 주고, 그리고 찾아낸 파일들을 어떻게 처리할 것인지 대해 명시하는 것 뿐이다.

더 복잡한 방법으로 find를 사용하는 것의 핵심은, 검색 파라미터는 실제로는 find가 평가하는 "논리 표현식(logical
expression)이라는 것을 깨닫는 것이다.(실제 find를 사용하는 대 부분의 유저는 논리 표현식을 사용하지 않는다)

즉. find는
한번에 하나씩 모든 파일들을 본다(솔직히 이것은 사실이다. 그러나 우리눈에 보일정도로 느리진 않다)
명령행 연산자가 제공한 표현식을 평가하기 위해 indoe에 들어있는 정보를 사용한다.(앞서 inode는 많이 사용하지
않는다는 얘기를 들어 생략했다)
표현식의 값이 참이면 지정된 행동을 한다.(예를 들면 파일의 이름을 출력하기 위해)

예를 들어 다음 표현식은 참이다
find / -name "*.c"

이런식으로 생각하게 되면 논리 연산자도 쉽다. 다음 표현식은 2개의 확장자에 해당되는 파일을 찾는다

-name "*.o" -o -name "*.tmp" -print

위 예제는 *.o와 *.tmp로 끝나는 파일들을 찾는다. 그럼 위의 확장자를 가진 파일을 찾는다면 다음의 표현식을
넣어 액세스 시간이 맞는지 검색한다

-atime +5 \( -name "*.o" -o -name "*.tmp" \)

find 안에 괄호를 넣으면 해당 부분을 먼저 계산한다. 앞에서 잠깐 설명했지만 괄호 앞에 \ 를 넣은건
서브 쉘 연산자로 의식하지 말라고 넣은 것이다.

그러나 위의 예제를 다음과 같이 바꾸면 참이 아니다.

atime +5 -name "*.o" -o -name "*.tmp"

위의 예제는 이름이 *.tmp로 끝난다. 이면 참이라는 틀린 식이 된다. 이 잘못된 표현식은 .tmp로 끝나는
모든 파일들에 대해 그 파일이 언제 액세스 되었간 간에 참이 될 것이다. 즉 -atime이 적용되지 않는다.
그러나 위의 표현식은 틀린 식이 아니다. 그러나 우리가 원하는 일을 하지 않을 뿐이다.

위의 예제를 조금 더 응용해서 현재 디렉토리에 있는 파일들을 찾으려면 다음과 같이 내리면 된다.

find . -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 반대로 위의 파일들만 찾지 않는다면 ! 연산자를 사용하면 된다..

find . ! -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 위의 표현식은 -atime 연산자에 대해서만 적용한다. 모든 연산자에 사용하려면 -atime 연산자에도
괄호를 아래와 같이 사용하면 된다.

find . ! \( -atime +5 \( -name "*.o" -o -name "*.tmp" \) \)-print

-print도 표현식이다. 이것은 항상 참으로 평가된다. 이외에 -ok, -exec 도 항상 참으로 평가된다.
이 표현식들이 좋게 사용될 때가 있긴 하다. 뒤에서 다시 다룬다.

그리고 여러분들이 find를 사용할 때 실수 하는 것 중 하나는 공백을 넣지 않는 것이다. 모든 연산자에는
공백이 필요함을 기억하기 바란다.

find가 찾는 시간들

일반적으로 -atime 부류의 연산자들에 대해서는 아쉽게도 문서화가 되어 있지 않다. 이 시간들은 일반적으로
일 단위이다.

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

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

플러스 부호가 붙은 숫자는 그 시간 전의 24시간 기간을 가리킨다. 예를 들면 +3은 3일 이상 된 시간이다. (달리 말하면
96시간 이상)

정확한 파일 비교

"이 부분에 대해서는 언급을 생략한다. 위에서 언급한 책을 보면 자세하게 잘 나와있으니 참고하기 바란다."

찾은 파일 실행하기

find에서 찾은 파일을 실행할 수 있는데 여기서 -exec 연산자는 끝 부분에 항상 \;를 넣는다. 그러나 find가 다르게
취급하는 인자가 있는데 이 인자는 바로 중괄호이다. {} 이 두문자들은 find가 발견하는 파일의 이름을 갖는 변수이다.
예제를 보면 더 확실할 것이다. 다음 예제는 간단한 경우로써 -print 연산자를 흉내내는 echo 연산자가 있다.

find . -exec echo {} \;

c쉘은 {} 문자를 사용하지만 {}를 바꾸진 않으므로 이 문자를 인용부호로 덮어쌓일 필요는 없다. 그러나 \;에서 \는
''로 대체가 가능하다. 세미 콜론은 항상 ';'로 C쉘에서는 하는 걸로 익히자..

그리고 find안에 또 다른 find의 호출이 가능하다

여기에선 또 다른 호출에 대해서는 생략한다

-exec 커스터 테스트하기

-exec 연산자를 이용해서 커스템 테스트를 할 수 있는데 앞서 잠시 얘기했지만 되도록 -exec 연산자를 피하는게 좋다
사용해야 한다면 -ok 를 사용하는 방법과 확실히 그걸 실행해야 하는지 확인해 본다. 그리고 -exec 연산자는 꼭 find
명령의 뒤쪽에 놔두도록 한다.

HandTip

여기엔 기재하지 않았지만 \ 를 줄 바꿈 연산자로 사용할 수 있다. SQL에서도 사용가능하니 유용할 것이다. 다량의
명령어를 내릴때 상당히 유용한 기능이다.

find의 진정한 역할?

find의 진짜 역활은 파일의 위치를 찾는 것이 아니라 표현식을 평가하는 것이다. 그렇다. find는 확실히 파일의 위치를
찾아준다. 그러나 그것은 부수적인 것이다. 이점을 이해하는 것이 find를 이용하는 데에 있어 이해가 빠르고 find를
훨씬 더 자유롭게 유용하게 만드는 개념적인 발전이 될 수도 있다.

-type 연산자의 유형들

b - 블록 특수 파일("장치 파일")
c - 문자 특수 파일("장치 파일")
d - 디렉토리
f - 일반파일
l - 심볼릭 파일
p - 이름 파이프 파일
s - 소켓 파일

// 이 아래부분에서 더 이상 설명를 다루지 않습니다.

find . -size 1234c -print

- 보다 더 작은 , + 보다 더 큰

find . -name \*.o -perm 664 -print

find . -type d -perm 777 -print

----w---- 패턴은 -20과 같다.

퍼미션 8진 값
rwxrwxrwx 777
rwxrwxr-x 775
rw-rw-rw- 666
rw-rw-r-- 664
rw-rw---- 660

find . -perm -100 -print

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

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

ksh 에서 history 기능 사용 하는 방법

1. 1주일치만 보고 싶다면

   #last | more


이렇게 하시면 될거 같구요.


2. 도스 프롬프트에서 처럼 history 기능을 사용하고 싶다면(Shell이 지원을 해야 합니다.)

Ksh 유저의 경우

#set -o vi

수행하신후 Esc 키 누르고 난후 K키를 누르시면 약간의 history 기능을 사용할 수 있습니다.

prev 1 next