WorkaHolic/ORACLE

Linux 파일 커맨드 마스터 가이드

2008. 12. 30. 16:26
반응형

[참고] http://www.oracle.com/technology/global/kr/pub/articles/calish_file_commands.html

Linux 파일 커맨드 마스터 가이드
Sheryl Calish

Linux 파일 커맨드 정복을 위한 입문자 속성 코스.

KDE, GNOME과 같은 Linux GUI 데스크탑 환경이 사용하기 편리한 것은 사실이지만, 커맨드 라인 인터페이스가 제공하는 강력하고 유연한 기능의 필요성을 결코 배제할 수는 없습니다. 또, 쉘 스크립트를 이용한 자동화 환경을 구현하기 위해서는 커맨드에 대한 기본적 지식이 필수적으로 요구됩니다.

이 문서는 Linux 운영체제를 처음 접하는 사용자, 또는 관련 지식의 재정리가 필요한 사용자들을 위한 “속성 코스”로써 기획되었습니다. 이 문서를 통해 Linux 운영체제에서 가장 유용하게 사용되는 커맨드들을 소개하고, 실제 응용 방법에 대한 가이드를 제공하고자 합니다. 여기에서 제공되는 정보와 약간의 실습을 통해 핵심적인 커맨드를 쉽게 마스터하실 수 있을 것입니다 (참고: Oracle Cluster File System (OCFS) 환경에 맞게 재컴파일된 커널에서는 커맨드의 동작 방식이 다소 달라질 수 있습니다. 이러한 경우를 위해, 오라클은 Linux 파일 커맨드 대신 사용할 수 있는 OCFS 툴셋을 제공합니다.)

본 문서에 포함된 모든 예제는 SUSE Linux 8.0 Professional 환경에서 테스트된 것임을 미리 밝혀둡니다. 여기서 설명된 커맨드들이 다른 시스템에서 다르게 동작할 이유는 없겠지만, 혹시라도 문제가 발생하는 경우에는 제품문서를 참고하시기 바랍니다.

기본 개념

먼저 몇 가지 기본적인 개념을 짚고 넘어가기로 하겠습니다.

파일과 커맨드
Linux/UNIX 운영체제에서는 하드웨어(키보드, 터미널 포함), 디렉토리, 파일 등의 모든 개체가 파일로써 취급됩니다. 다소 기묘한 접근 방식으로 생각될 수도 있지만, 실제로 이러한 개념은 Linux/UNIX 운영체제의 강력한 기능과 유연성의 근간이 되고 있습니다.

일부 변형된 형식을 제외하고, 대부분의 커맨드는 아래와 같은 형식을 갖습니다:

command [option] [source file(s)] [target file]

도움말 보기

Linux를 배우는 과정에서 가장 유용한 커맨드는 무엇보다도 도움말에 관련된 명령일 것입니다. Linux는 온라인 레퍼런스 매뉴얼(man 페이지)와 whatis 커맨드를 제공합니다. whatis 커맨드는 사용자가 친숙하지 않은 커맨드의 man 페이지에 대한 간략한 설명을 제공합니다.

$ whatis echo

좀 더 자세한 정보를 확인하고 싶다면 아래 커맨드를 사용합니다:

$ man  echo 

특정 작업을 수행하는데 필요한 커맨드가 무엇인지 모르는 경우에는, man -k 커맨드로 키워드를 입력합니다:

$ man -k files

유용하지만 자주 간과되곤 하는 명령 중 하나가 바로 man 페이지 자체에 대한 도움말입니다:

$ man man
스페이스 키를 누르면서 man 페이지의 스크롤을 수행할 수 있습니다. 위쪽 화살표를 누르면 파일의 위쪽으로 이동합니다. man 페이지를 종료하려면 “q,!”을 입력하거나, CTRL-Z를 누릅니다.

사용자 클래스

“모든 생명체는 평등하지만, 다른 생명체보다 더 평등한 생명체도 있다”라는 격언을 알고 계십니까? Linux 세계에서는 root 사용자가 모든 것을 지배합니다.

root 사용자는 su (superuser의 약칭) 커맨드를 이용하여 다른 사용자 계정에 로그인할 수 있습니다. 새로운 사용자, 프린터, 또는 파일 시스템에 관련된 작업을 수행하고자 하는 경우, root 계정으로 로그인 하거나 su 커맨드를 입력하고 root 암호를 입력하면 됩니다. 시스템 파일과 초기화 프로세스에 관련된 파일은 root 사용자가 소유하고 있습니다. 이러한 파일에 대한 읽기 권한은 일반 사용자에게 허용될 수 있지만, 편집 권한만큼은 root 사용자에게만 허용됩니다.

BASH 쉘

여러 가지 쉘이 사용 가능하지만, Linux의 디폴트 쉘은 BASH (Borne Again Shell)로 설정되어 있습니다. BASH는 Bourne 쉘과 Korn, C, TCSH 쉘 등의 기능을 조합한 형태로 구현됩니다.

BASH의 빌트인 커맨드인 history는 디폴트로 최근 입력된 500 개의 커맨드에 대한 정보를 제공합니다. 커맨드 프롬프트에서 history를 실행한 뒤, 위쪽 화살표 또는 아래쪽 화살표를 이용하여 이동하거나 "!"와 함께 히스토리 리스트의 숫자를 입력하는 방법으로 특정 커맨드를 실행할 수 있습니다:

$ !49

또 히스토리 리스트의 최상위 엔트리를 기준으로 한 오프셋 정보를 활용할 수도 있습니다: 히스토리 리스트에 53개의 이벤트가 존재하는 경우, $ !-3을 입력하면 event number 51이 실행됩니다.

UNIX/Linux에서 사용되는 다른 쉘들과 마찬가지로, BASH는 시스템 운영을 위한 환경 변수를 제공합니다. 그 몇 가지 예가 아래와 같습니다:

  • HOME – 사용자의 홈 디렉토리
  • TH – 입력한 커맨드의 실행 파일을 찾기 위한 검색 경로
  • HISTSIZE – 시스템에 저장되는 히스토리 이벤트의 숫자

이러한 예약 변수 이외에도, 사용자가 직접 자신만의 환경 변수를 생성하는 것도 가능합니다. 한 예로, 오라클의 경우 오라클 설치 과정에서 ORACLE_HOME 환경 변수를 생성하여 사용합니다.

변수는 프롬프트 상에서 임시로 변경이 가능합니다:
$HISTSIZE=100
또는, /etc/profile (requires root privileges) 파일을 수정하여 시스템 전역에 변경 내용을 영구 저장하거나, .profile을 이용하여 로컬 환경에만 변경 사항을 영구적으로 반영할 수 있습니다.

환경 변수의 설정값은 echo 커맨드와 $ 기호를 이용하여 조회할 수 있습니다.
 
$ echo $HOME
/home/bluher

전체 환경 변수를 조회하려면 env 커맨드를 사용합니다.

정규표현식과 와일드카드

Linux 커맨드에서 “*”, “?” 와일드카드는 각각 하나 또는 여러 개의 문자를 대체하는 용도로 사용됩니다. 정규표현식(regular expression)에서는 “.” 문자를 이용하여 “new line” 문자를 제외한 모든 단일 문자를 대체할 수 있습니다. 또 와일드카드와 정규표현식 모두 “[ ]” 기호를 이용하여 문자 단위의 매칭을 수행합니다. “*” 기호는 그 사용법이 조금 다릅니다. 와일드카드에서는 “*” 기호가 하나 또는 그 이상의 문자를 대체하는 용도로 사용되지만, 정규표현식에서는 앞 문자가 0개 또는 그 이상 반복되는 것을 의미합니다. egrep, awk 등의 커맨드는 이보다 좀더 다양한 패턴 매칭 기능을 제공합니다.

파일 조작을 위한 명령

파일 목록

ls 커맨드는 사용자가 실행 권한을 갖는 디렉토리의 파일 목록을 보여줍니다. ls 커맨드에는 재미 있는 옵션이 여럿 있습니다. 응용의 예가 아래와 같습니다:

$ ls -liah *
22684 -rw-r--r--    1 bluher   users         952 Dec 28 18:43 .profile
19942 -rw-r--r--    1 scalish  users          30 Jan  3 20:00 test2.out
  925 -rwxr-xr-x    1 scalish  users         378 Sep  2  2002 test.sh

위 실행 결과에서는 8 개의 컬럼이 표시되고 있습니다:

  • 첫 번째 컬럼은 파일의 inode 정보를 의미하며, -i 옵션을
  • 용한 경우 표시됩니다. 나머지 컬럼들은 일반적으로 -l 옵션을 사용하는 경우 표시됩니다.
  • 두 번째 컬럼은 파일 타입과 파일 액세스 권한을 의미합니다
  • 세 번째 컬럼은 링크의 숫자(디렉토리 포함)를 의미합니다.
  • 네 번째 컬럼과 다섯 번째 컬럼은 파일의 owner와 group owner를 의미합니다. 위에서는 “bluher” owner가 “users” group에 포함되어 있음을 알 수 있습니다.
  • 여섯 번째의 파일 사이즈 컬럼에서는 -h 옵션이 사용되었기 대문에 파일 사이즈가 바이트 수(디폴트) 대신 사용자가 읽기 쉬운 단위로 변환되어 표시됩니다.
  • 일곱 번째 컬럼은 날짜(월, 일,년)를 의미합니다.
  • 여덟 번째 컬럼에는 파일네임이 표시되고 있습니다. -a 옵션을 사용한 경우에는 .profile과 같은 숨겨진 파일이 목록에 함께 표시됩니다.
파일 관련 작업

파일의 이동(mv), 복사(cp), 삭제(rm)를 위한 커맨드가 기본적으로 지원됩니다. 이때 -i 옵션을 사용하여 확인 절차를 거치는 것이 바람직합니다.

$ cp -i ls.out ls2.out
cp: overwrite `ls2.out'?
mv 커맨드의 -b 옵션은 파일을 이동하기 전에 백업본을 생성합니다. rm, cp 명령의 -r 옵션은 매우 강력하지만 한편으로는 위험한 옵션입니다. 이 옵션을 사용하면 모든 하위 디렉토리와 파일을 재귀적으로 삭제 또는 복사합니다.
$ rm -ir Test
rm: descend into directory `Test'? y
mkdir은 디렉토리의 생성, rmdir은 디렉토리의 삭제를 위한 커맨드입니다. 하지만, 파일을 포함하고 있는 디렉토리는 rmdir로 삭제할 수 없습니다. 이런 경우에는 rm -r 을 이용하는 것이 편리합니다.

모든 파일에는 소유권과 접근권한이 정의됩니다. 파일 접근 권한(filemode)은 10개의 문자로 정의됩니다:
  • 첫 번째 문자는 파일의 타입을 의미합니다. 예를 들어 “-”는 파일을, d 는 디렉토리를, l은 링크를 의미합니다.
  • 나머지 9개 문자는 사용자 클래스(owner(2-4), owner group(5-7), others(8-10)) 별로 파일 접근 권한을 정의합니다. 여기서 r은 읽기 권한을, w는 쓰기 권한을, x는 실행 권한을 의미합니다. “-” 기호는 해당 작업이 해

접근 권한은 chmod 커맨드를 통해 문자 심볼, 또는 2진 마스크(binary mask)로 설정됩니다. 2진 마스크를 사용하는 경우에는, 3개 그룹의 권한 설정에 사용된 문자를 2진수로 변환하고 다시 8진수로 변환하는 과정을 거쳐야 합니다:

사용자 클래스: Owner Group Others
문자: rwx r-x r--
2진수: 111 101 100
8진수: 7 5 4

group에 쓰기 권한을 할당하려면 아래와 같이 실행합니다:

chmod g+w test.sh or chmod 774 test.sh
디폴트 파일 접근권한은 umask 커맨드로 설정합니다. /etc/init.dev 파일을 이용하는 경우에는 시스템 전역에, .profile 파일을 이용하는 경우에는 사용자 로컬 계정에 변경 사항이 적용됩니다. umask 커맨드는 777에서 지정된 숫자를 뺀 결과를 디폴트 접근권한으로 설정합니다:
$ umask 022
위와 같이 실행한 경우, 사용자가 새로 생성하는 파일에는 755의 디폴트 파일 접근권한이 적용됩니다.
파일의 소유권은 chown 커맨드로 변경합니다:
$ chown bluher ls.out

위에서 bluher는 새로운 파일 소유자를 의미합니다. 마찬가지로, 그룹 멤버십도 아래와 같이 변경할 수 있습니다:

$ chgrp devgrp ls.out

위와 같이 실행한 경우 devgrp이 새로운 그룹으로 설정됩니다.

그리고 ls 커맨드가 제공하는 정보만으로는 파일이 텍스트인지 바이너리인지 구분할 수 없다는 사실을 참고하시기 바랍니다. 이 정보를 얻으려면 file * 커맨드를 사용해야 합니다.

파일 이름의 변경

파일에 두 개 이상의 이름을 주기 위한 두 가지 방법으로 링크(link)와 alias 커맨드가 있습니다. alias는 긴 명령을 짧게 압축시키는 용도로 이용할 수도 있습니다:

$ alias ll='ls -l'
$ ll

위에서 작은 따옴표를 사용해야만, BASH가 evaluation 과정을 거치지 않고 인용된 명령을 그대로 전달한다는 사실을 참고하십시오. 또 alias를 이용하여 긴 경로명을 압축시킬 수도 있습니다:

$ alias jdev9i=/jdev9i/jdev/bin/jdev

alias와 unalias에 대한 자세한 정보는, BASH man 페이지의 "SHELL BUILTIN COMMANDS" 서브섹션을 참고하시기 바랍니다. 위의 마지막 실행 예의 경우, 환경 변수를 이용해서도 이와 동일한 결과를 얻을 수 있습니다:

$ export JDEV_HOME=/jdev9i/jdev/bin/jdev
$ echo $JDEV_HOME
/jdev9i/jdev/bin/jdev
$ $JDEV_HOME

링크를 이용하면 여러 개의 파일명이 동일한 소스 파일을 참조하도록 설정할 수 있습니다:

ln [-s] fileyouwanttolinkto newname

ln 커맨드는 디폴트로 파일에 대한 하드 링크(hard link)를 생성하고, -s 옵션을 사용한 경우에는 심볼릭 링크(symbolic link)를 생성합니다. 하드 링크는 원래 파일과 거의 구분이 불가능하며, 두 파일은 동일한 inode를 갖습니다. 심볼릭 링크는 ls –l 명령을 사용한 경우 파일 타입이 “l”로 표시되기 때문에 구분하기가 좀 더 쉽습니다.

파일의 검색

파일 필터

파일 컨텐트를 읽고 실행하는데 사용되는 커맨드들을 “필터(filter)”라 부르기도 합니다. (대표적인 필터 중 sed, awk 커맨드는 이미 다른 OTN 아티클에서 상세하게 다루어진 바 있기 때문에, 여기에서는 설명하지 않기로 하겠습니다.)

cat, more, less 등의 커맨드는 에디터를 실행하지 않은 상태에서 텍스트 파일의 컨텐트를 조회하는 목적으로 사용됩니다. cat은 “concatenate”의 약어로 디폴트로 파일 컨텐트를 표준 출력(스크린)으로 프린트합니다. cat -n 명령을 사용하면 파일 컨텐트의 라인 넘버를 표시합니다.

$ cat -n test.out
     1  This is a test.

cat은 파일의 전체 내용을 한꺼번에 출력합니다. 반면, more와 less는 파일 컨텐트를 스크린 단위로 표시합니다. Less는 more 보다 좀 더 개선된 버전으로, vi 텍스트 편집기의 명령을 사용할 수 있습니다. 예를 들어 d는 앞으로 스크롤, b는 뒤로 스크롤을 수행하며, d 또는 b 앞에 숫자(N)를 명시하면 N 라인만큼 스크롤 합니다. N에 입력된 값은 이후 수행되는 d 또는 b 커맨드의 디폴트 값으로 설정됩니다. man 페이지 유틸리티는 매뉴얼 컨텐트를 표시하기 위해 less 커맨드를 사용하고 있습니다.

리다이렉션과 파이프

리다이렉션(redirection)은 커맨드 출력을 표준 출력/입력 이외의 다른 파일로 전달할 수 있게 합니다. 리다이렉션을 위한 표준 심볼인 “>”은 새로운 파일을 생성하며, “>>”은 출력 결과를 기존 파일에 덧붙입니다:

$ more test2.out
  Another test. 
$ cat test.out >> test2.out
$ cat test2.out
Another test.
This is a test.

“< ” 심볼은 파일을 표준 입력으로 전달합니다:

$ cat < test2.out

“2>”와 “2>>“는 에러 메지지를 새로운 파일 또는 기존 파일로 전달합니다:

$ command 2> name_of_error_file

기존 파일을 실수로 덮어쓰는 사고를 방지하려면, 아래와 같이 BASH 빌트인 커맨드를 실행해 둡니다:

$ set -o noclobber

“>!” 심볼을 사용한 경우에는 위의 설정이 무시됩니다. 위 설정을 비활성화하려면 “-o” 대신 “+o” 옵션을 사용합니다.
커맨드와 파일 모두가 리다이렉션의 대상이 될 수 있습니다. 하지만 리다이렉션 구문 안에는 반드시 하나의 파일이 포함되어 있어야 합니다.
파이프(pipe)는 “|” 심볼을 사용하며, 커맨드를 대상으로 합니다. 예를 들어 커맨드의 출력을 프린터로 직접 전달하고자 하는 경우 아래와 같이 실행합니다:

$ ls -l * | lpr

파이프를 이용하여 히스토리 리스트에서 필요한 커맨드를 쉽게 찾을 수도 있습니다:

$ history | grep cat

그 밖의 필터

Grep, fgrep, egrep은 모두 패턴과 일치하는 라인을 출력하는 커맨드입니다. 3가지 커맨드 모두 파일 내에 존재하는 특정 패턴을 검색하며, 특히 필요한 파일의 이름을 기억하지 못하는 경우에 유용하게 활용됩니다. 커맨드의 기본 포맷이 다음과 같습니다:

grep [options] PATTERN [FILE...]

$ grep -r 'Subject' nsmail 

커맨드의 실행을 중단하려면 CTRL-Z를 입력합니다.

grep 커맨드에서 가장 유용하게 사용되는 옵션이 바로 -s 입니다. root 계정이 아닌 다른 사용자 계정으로 시스템 파일을 검색하는 경우, 접근 권한이 없는 파일이 검색될 때마다 에러 메시지가 발생하게 됩니다. 이 옵션은 이러한 에러 메시지를 차단하는 역할을 합니다.

Fgrep은 grep -F로도 실행가능하며, 정규표현식을 사용하는 grep과 달리 고정된 문자열만을 검색합니다. egrep은 특수 문자를 이용한 조건 검색을 지원합니다. 예를 들어 “|” 기호를 사용하여 OR 조건의 검색을 수행할 수 있습니다:

$ egrep 'Subject|mailto' *

파일의 검색

GNU 버전의 find 커맨드는 강력하고 유연할 뿐만 아니라, 기존 UNIX 시스템에서 제공되던 커맨드보다 사용하기에 덜 까다롭습니다. find 커맨드는 파일의 검색, 파일에 대한 커맨드 실행 등, 디렉토리 구조에 관련된 작업 수행 시 유용하게 활용됩니다. find 커맨드의 기본 포맷이 아래와 같습니다:

$ find startdirectory options matchcriteria [actionoptions]

찾아야 할 파일의 이름을 부분적으로나마 알고 있지만, 디렉토리 위치는 알고 있지 못한 경우, 아래와 같이 실행합니다:

$ find . -name 'test*'
./test
./jdevhome/mywork/EmpWS/EmpBC4J/test

기존 UNIX 시스템의 경우와 달리, Linux에서는 find 커맨드의 뒷부분에 -print를 붙일 필요가 없습니다. 시작디렉토리 부분에 “.”을 입력한 경우, find는 현재 디렉토리에서 검색을 시작합니다. 또 “..”을 사용하면 부모 디렉토리에서 검색을 시작합니다. 물론 검색할 디렉토리를 직접 지정할 수도 있습니다.

검색 조건에 와일드카드를 사용한 경우에는 반드시 전체 항목을 작은 따옴표로 묶어주어야 한다는 점에 주의하시기 바랍니다:

$ find . -name 'test*' -print
./test.out
./test2.out
.out 확장자를 갖는 파일을 검색하기 위한 명령이 아래와 같습니다:
$ find /home -name '*.out'
하지만 이 명령을 superuser 계정으로 실행하지 않는 경우, 많은 수의 “Permission denied” 에러 메시지가 발생할 수 있습니다.
find에 --exec grep 을 사용하여 매우 강력한 검색 옵션을 적용할 수 있습니다:
$ find . -name '*.html' -exec grep 'mailto:foo@yahoo.com' {} \;
다음 단계
다운로드 – Oracle Database 10g for Linux

Linux 테크놀로지 센터에 방문하고 바로가기에 등록하십시오
명령은 현재 디렉토리를 기준으로 *.html 파일을 검색하고, 현재 파일({})에 대해 grep 커맨드를 실행(exec)합니다. 세미콜론(;)은 find에 몇 가지 다른 액션이 추가되었음을 의미하기 위해 덧붙여졌습니다. 또 BASH가 전달된 문자열을 쉘이 아닌 커맨드에서 해독(interpret)하도록 하기 위해 백슬래시(\)와 작은 따옴표가 사용되었습니다.

결론

Linux가 제공하는 유용한 커맨드와 그 활용 방법이 워낙 다양하기 때문에, 여기에서 모든 내용을 다루지는 못했습니다. 또, 한 가지 작업에 대해 여러 가지 대안이 제공되는 경우가 많습니다.

본 문서에서는 가장 기본적이고 활용도가 높은 Linux 파일 커맨드를 위주로 살펴 보았습니다. 여기에서 제공된 정보를 이용하여 Linux를 쉽고 빠르게 마스터하실 수 있을 것입니다. 또, man 페이지를 적절히 활용하면서 적극적인 실험 정신을 발휘하신다면, Linux 파일 작업에 관련된 지식을 쉽게 얻으실 수 있을 것입니다.

반응형