이명헌 경영 스쿨
[리눅스] 리눅스의 기본 명령어들
레고 블럭들
이명헌 [ 2002-3-25 ]

tux리눅스 명령어(command)는 하나하나가 독립적인 프로그램으로 /bin 디렉토리 같은 곳에 들어 있습니다. 유닉스가 아름다운 것은 핵심적인 기능을 완벽하게 수행해주는 작지만 견고한 프로그램(=명령어)들이 |(파이프 문자)를 통해서 다양한 형태로 조합되어 매우 복잡한 기능을 해내는 방식으로 설계되어 있기 때문입니다. 견고한 레고 블럭을 조립하는 것입니다.

최근의 리눅스 배포본은 GUI(Graphical User Interface)가 대폭적으로 도입되어 사실상 매킨토시나 윈도우즈처럼 마우스 포인터와 클릭으로 많은 작업을 수행할 수 있게 되었지만, 역시 리눅스의 참맛은 터미널창에서 명령어를 타이핑하는 데서 느낄 수 있습니다. 도스(DOS)의 조잡함과 달리 유닉스 명령어는 단순한 명령어가 파이프문자를 통해 아름답게 조화되면서 "Simple and elegant"란 무엇인가를 확실하게 보여줍니다.

유닉스의 명령어 즉, 커맨드는 무척 많고, 이들 하나하나가 많은 옵션이 달려있어서 명령어 하나를 철저하게 아는 것도 간단한 일이 아닙니다. 하지만 자주 쓰이는 명령어는 소수에 불과하기 때문에 몇몇 커맨드만 알아도 일상적인 작업을 하는 데 그다지 큰 불편은 없습니다.

이 글은 오라일리 씨리즈 중 "Running Linux"의 4장, "Basic Unix Commands and Concepts"를 중심으로 리눅스 명령어 중 가장 기본적이고 많이 쓰이는 것들을 정리한 것입니다.


파일, 디렉토리 관련

cd

change directory의 약자입니다. 다른 디렉토리로 이동할 때 사용합니다. 만약 /usr/local/apache 디렉토리로 이동하고 싶다면,

cd /usr/local/apache

입니다. 디렉토리 이름 없이 그냥 cd만 타이핑하면 자신의 홈 디렉토리로 갑니다. 예를 들어 내가 "linuxer"라는 이름으로 로그인했다면 현재 어느 디렉토리에 있든지 cd를 치면 /home/linuxer로 이동합니다. 내가 root 라면 /root로 가겠죠? 또 하나, ~(물결표시)는 로그인한 유져의 홈 디렉토리를 의미합니다. 즉, cdcd ~와 똑같습니다. 참고로, 현재 머물고 있는 디렉토리 이름을 알려 주는 명령어는 pwd입니다. "print working directory"의 약자입니다.

ls

디렉토리의 내용물을 보여주는 커맨드입니다. 자주 쓰는 옵션으로는 ls -als -l이 있습니다. ls -a는 "all", 숨겨진 파일까지 모두 보여줍니다. 파일 이름이 점(.)으로 시작하는 파일은 보통의 ls 명령에서는 나타나지 않는 숨겨진(hidden) 파일입니다. 숨겨진 파일은 특정 프로그램의 설정(configuration) 파일인 경우가 많습니다. 이를테면 vi의 환경설정 파일인 .exrc같은 것입니다. 분명히 개별 홈 디렉토리에 존재함에도 ls만 쳐서는 나타나지 않습니다. 이렇게 숨겨진 파일까지 모두 보여주는 명령어가 ls -a입니다.

ls -l은 "long", 즉, 긴 형태로 리스팅하는 명령어입니다.

# ls -l
drwxr-xr-x 2 linuxer users 3242 Nov 2 10:14 perltips
-rw-r--r-- 1 linuxer users 12 Dec 13 11:10 counter.pl

앞의 drwxr- 부분은 퍼미션(permission)을 나타냅니다. "d"로 시작하는 것은 디렉토리를 나타내고 "-"로 시작하는 것은 보통의 파일이라는 정도만 알아두세요. 퍼미션은 밑에서 자세히 다룹니다.

퍼미션 다음의 1,2라는 숫자는 하드링크(hard link)의 갯수를 나타내고, 그 다음은 파일의 소유자(owner;user), 그 다음은 그룹(group), 그 다음은 파일의 크기, 그 다음은 파일의 생성시간, 그리고 마지막으로 파일이나 디렉토리의 이름이 나옵니다. 이렇게 길게 리스팅하는 명령어가 ls -l입니다. 레드햇 리눅스 배포본인 경우 ls -l을 줄여서 ll로 해도 됩니다.

참고로, 점 하나는 현재 디렉토리를 가리키고 두 개는 .. 한 단계 위 디렉토리를 가리킵니다. 그러므로 한 단계 위 디렉토리의 파일들을 리스팅하려면 ls ..이라고 하면 되겠죠?

mkdir

이름처럼 "make directory"입니다. 디렉토리를 만듭니다.

mkdir newDirectory

처럼 사용합니다. 이것과 반대되는 것은,

rm

rm은 "remove"의 약자로 생각하세요. 파일이나 디렉토리를 지울 때 사용합니다.

rm useless

rm는 파일은 삭제할 수 있지만 디렉토리는 삭제하지 못 합니다. 디렉토리와 그 내용물을 모두 삭제하려면 rm -r이라고 하면 됩니다. 또는, 삭제 확인 질문이 뜨지 않게 하려면 rm -rf라고 해도 됩니다.

rm -r oldDirectory

rm -rf는 확인절차 없이 삭제하므로 극도로 조심해서 사용해야 합니다. 리눅스에서는 삭제된 파일이나 디렉토리를 절대 복구 못 합니다.

cp

cp는 "copy"의 약자입니다.

cp somefile somewhere

형태로 사용합니다. 그냥 cp만 사용하는 경우 디렉토리 내의 모든 파일들과 서브 디렉토리 내의 파일들을 한 번에 카피할 수가 없습니다. 이럴 때 사용하는 것이 cp -r입니다. 이 명령어는 해당 디렉토리의 모든 파일과 서브 디렉토리를 원하는 곳으로 카피합니다. 새로 카피할 디렉토리가 없는 경우 만들어서 카피하기 때문에 아주 편리합니다. 예를 들어,

cp -r . /home/linuxer

라고 하면, 현재 디렉토리에 있는 모든 파일과 서브 디렉토리를 /home/linuxer로 복사합니다.

눈치채셨는지 모르겠지만, rm -rcp -r에서 -r은 비슷한 의미를 갖습니다. -r은 "recursive"(순환의, 반복의)의 약자로, 밑에 서브 디렉토리가 있으면 계속해서 그 내용물까지 파고 든다는 의미입니다. 유닉스 커맨드는 이렇게 한 가지를 알면 다른 곳에서도 활용할 수 있는 경우가 많습니다. 예를 들어 -a 옵션은 여러 명령어에 붙어서 "all"의 의미를 갖는 경우가 많습니다.

mv

이름처럼 "move", 파일을 이동하는 명령어입니다.
mv file1 ~ 이렇게 하면 현재 머물고 있는 디렉토리 내의 file1을 내 홈 디렉토리로 옮깁니다. 물결 표시는 로그인한 유져의 홈 디렉토리라고 했죠? 옮길 목적지 디렉토리가 없다면 디렉토리를 만들어서 옮깁니다.

mv filename destination

처럼 사용합니다.

mv는 파일 이름이나 디렉토리 이름을 바꾸는 데도 사용합니다.

mv old.txt new.txt

old.txt라는 파일이름을 new.txt라는 파일이름으로 바꿉니다. 리눅스에서는 "rename"이라는 명령어가 따로 없습니다. mv가 그 역할을 합니다.(에는 rename old, new가 있습니다)

ln -s

심볼릭 링크(Symbolic link)를 만드는 명령어입니다. 심볼릭 링크는 윈도우즈의 "바로가기", 맥의 "가상본"과 유사한 것으로 이해하세요.

ln -s filename linkname

퍼미션 (Permission)

퍼미션은 이름처럼 '허가'를 뜻합니다. 파일이나 디렉토리를 누가 볼 수 있으며 누가 새로운 내용을 기록할 수 있으며 또 실행할 수 있는지 설정하는 것입니다. 유닉스(리눅스)에서는 개별 파일 별로 퍼미션을 설정할 수 있습니다. 바꿔 말하면 "파일 수준의 보안"이 가능합니다. 유닉스의 큰 강점 중 하나입니다. 퍼미션이 없는 사용자가 특정 파일이나 디렉토리에 접근하면 "Permission denied"라는 메씨지가 뜨면서 사용자의 행동을 차단합니다. 개별 파일 별로 확실한 보안이 이뤄지는 것입니다.

위의 ls 명령어 설명에서 잠깐 보았지만 퍼미션은 총 10개의 알파벳으로 이뤄져 있습니다. 맨 첫 번째 자리는 파일인지, 디렉토리인지를 나타내는 것으로 퍼미션과 직접적인 관계가 없습니다. 첫 번째 자리는 파일인 경우 -, 디렉토리인 경우 d로 표시되어 있습니다. 그 다음부터 나오는 9개의 알파벳이 해당 파일 또는 디렉토리의 퍼미션을 나타냅니다.

퍼미션에는 크게 세 종류가 있습니다. r은 "read"를 뜻하고, w는 "write", x는 "execute"을 뜻합니다. 읽기 허가, 쓰기 허가, 실행 허가입니다.

퍼미션을 나타내는 9개의 알파벳은 3개씩 끊어서 각각 "user", "group", "others"의 퍼미션을 나타냅니다. 예를 들어, 어떤 파일의 퍼미션이 다음과 같다면,

-rwxrw-r--

이것은 세 개씩 끊어서, rwx, rw-, r--로 읽고 (맨 앞의 -는 파일이라는 의미로 퍼미션과 직접 상관 없습니다.) 각각이 "user"의 퍼미션, "group"의 퍼미션, "others"의 퍼미션입니다. user 퍼미션은 rwx이므로, 읽기/쓰기/실행 모든 것이 다 허용되어 있습니다. group 퍼미션은 rw-이므로 "read", "write" 이므로 읽기,쓰기 퍼미션이 허용되어 있습니다. others 퍼미션은 r--이므로 읽기 퍼미션만 허용되어 있습니다. 그러므로 이 파일은, 파일의 owner(user)는 읽기,쓰기,실행 모든 것을 다 할 수 있고 owner와 같은 그룹에 속하는 사용자는 읽기,쓰기까지 할 수 있으며, owner도 아니고 owner가 속한 그룹도 아닌 사용자는 오직 읽기만을 할 수 있습니다.

디렉토리의 경우, r,w,x의 의미가 조금 달라집니다. r은 해당 디렉토리에 있는 파일의 목록을 읽을 수 있는가의 여부를 가르키고(즉, cd를 해들어갈 수 있느냐의 여부), w는 그 디렉토리에 새로운 파일을 첨가하거나 기존의 파일을 지울 수 있는가의 여부, x는 해당 디렉토리에 들어있는 파일에 관한 정보를 리스팅할 수 있느냐의 여부를(즉, ls를 할 수 있느냐의 여부) 의미합니다.

파일(디렉토리)의 owner는 대개 그 파일(디렉토리)를 만든 사람으로 처음에 설정됩니다. 특별히 퍼미션을 지정하지 않는 경우 기본적으로 설정되는 퍼미션은 rw-r--r--입니다. user는 읽기,쓰기가 허용되고 group을 포함한 다른 사용자는 오직 읽기만 가능한 파일(디렉토리)가 만들어지는 게 기본설정(default)입니다.

퍼미션을 바꾸고 싶다면 어떻게 할까요? 그럴 때 사용하는 코맨드가,

chmod

입니다. chmod는 "change mode"의 약자입니다.("츄모드" 또는 "츄마드"로 읽습니다.) chmod는 두 가지 사용법이 있습니다. 첫 번째 사용법은 + 기호나 - 기호를 사용합니다. 예를 들어, myprogram이라는 파일에 쓰기 퍼미션을 부여하고 싶다면,

chmod +w myprogram

라고 하면 됩니다. 이렇게 하면 user(owner), group, others 모두에 쓰기 퍼미션이 첨가됩니다.

user에만 쓰기 퍼미션을 첨가하고 싶다면 어떻게 할까요?

chmod u+w myprogram

라고 하면 됩니다. user는 u입니다. 마찬가지로 g는 "group", o는 "others"를 의미합니다. 그러므로 원하는 대로 퍼미션에 변화를 줄 수 있습니다.

퍼미션을 없애는 것도 같은 식입니다. 만약, others의 쓰기,실행 퍼미션을 없애고 싶다면,

chmod o-wx myprogram

라고 하면 됩니다. 다음 코맨드는 어떤 의미일까요?

chmod ug+wx myprogram

myprogram의 user와 group에 실행,쓰기 퍼미션을 주는 것임을 쉽게 알 수 있습니다.

chmod를 사용하는 다른 방법도 있습니다. "u+x"처럼 알파벳을 이용해서 퍼미션을 변경하는 방법을 "symbolic mode"라고 합니다. 이와 달리 8진법을 사용하는 방법을 "absolute mode"라고 합니다. 일단, r은 4, w는 2, x는 1이라고 외우세요. 8진법을 이용한 퍼미션 설정은, user, group, others 각각에 대해 퍼미션 알파벳에 해당하는 숫자를 합쳐주는 것입니다. 예컨데, 어떤 퍼미션이 -rwxr-xr-x라면, 이것은 755로 바꿀 수 있습니다. user 퍼미션은 rwx이므로 (4+2+1) = 7, group과 others는 r-x이므로 (4+1) = 5 이므로 755입니다. 좀 어렵나요? 익숙해지면 쉽습니다. 다음 퍼미션이 무엇을 의미하는지 한 번 맞춰 보세요.

chmod 500 myprogram
chmod 777 myprogram

첫 번째 것은 myprogram 파일을 -r-x------로 바꾸는 것이죠? 두 번째 것은, -rwxrwxrwx입니다.

4-2-1입니다. 외워 두세요.

chown, chgrp

퍼미션 관련 명령어의 마지막으로, user와 group을 바꿔주는 커맨드를 살펴봅시다. 이름 그대로입니다. chown는 해당 파일(디렉토리)의 user(owner)를 바꾸는 것이고 chgrp는 group을 바꾸는 것입니다. 이렇게 사용합니다.

chown myprogram linuxer
chgrp myprogram mygroup

물론 바꿀 수 있는 퍼미션이 있을 때에만 가능합니다. 예를 들어 root로 로그인한 상태거나 그 파일의 원 소유자인 경우입니다.

rpm 관련

rpm -Uvh

레드햇(RedHat) 리눅스를 사용하는 경우 소프트웨어들이 rpm 패키지 형태로 배포되는 것을 볼 수 있습니다. rpm 패키지를 다루는 명령어 중 자주 쓰이는 것은 사실 몇 개 없습니다.

먼저, rpm -Uvh입니다. 이것은 rpm을 이용해서 소프트웨어를 인스톨할 때 사용합니다. 원래 "U"의 의미는 새로 인스톨할 패키지와 기존에 인스톨되어 있는 것의 버전을 비교해서 더 최신 버전이면 "U"pdate한다는 것이지만 거의 모든 경우에 위와 같은 명령어로 다 인스톨 할 수 있습니다.

rpm -Uvh package-1.0.0.rpm

와 같은 형태로 사용합니다. 의존성(dependency) 때문에 인스톨이 안 되는 경우에는 rpm -Uvh --nodeps라고 하면 됩니다. 둘 다 외우세요.

rpm -qa

현재 머쉰에 어떤 rpm 패키쥐가 인스톨되어 있는지를 질의(query)하는 커맨드입니다. 설치된 모든 rpm 패키쥐가 버전과 함께 뜹니다.

rpm -e

지우는 명령입니다. 먼저 질의를 한 다음 거기 나온 이름을 rpm -e 뒤에 붙여 주면 되겠죠?

압축, 해제 관련

tar xvzf

타르(tar)로 묶은 다음 gzip으로 압축된 파일들을 한 번에 압축 해제부터 보따리 풀기까지 시행해 주는 명령어입니다. 가운데의 "z"를 빠뜨리면 안됩니다. tar는 "tape archive"의 약자로, 전통적으로 유닉스에서 파일을 백업할 때 테잎 장치를 사용한 데서 비롯된 명령어입니다. 이런 형태로 씁니다.

tar xvzf downloaded.tar.gz

tar cvzf

위와 반대로 여러 개의 파일을 tar로 묶은 다음 압축하는 명령입니다. c니까 "compress", x니까 "expand"입니다.

tar cvzf tarfile.tar.gz .

와 같은 형태로 씁니다. 현재 디렉토리 .에 있는 모든 파일을 묶어서 압축한 tarfile.tar.gz 파일을 만들게 됩니다.

tar cvf

"z"가 빠진 것이므로 압축은 하지 않고 묶어 주기만 합니다.

tar cvf tarfile.tar .

처럼 씁니다. 현재 디렉토리 .에 있는 파일을 모두 묶어서 tarfile.tar로 만드는 코맨드입니다. (맨 마지막에 점이 보이죠?)

gzip

gzip 압축 방식으로 압축하는 명령어입니다.

gzip documnet.txt

라고 하면 document.txt의 gzip 압축 파일인 document.txt.gz이 생깁니다.

gunzip

.gz 파일을 푸는 명령어입니다. "unzip"이니까 당연하죠? 이렇게 씁니다.

gunzip document.txt.gz

압축된 파일은 없어지고 압축이 풀린 "document.txt"라는 파일이 새로 생깁니다.

bunzip2

리눅스 커널의 경우, .bz2라는 확장자가 붙은 압축 파일 형태로 배포되는 경우가 있습니다. 바로 그 .bz2를 풀어 주는 명령어입니다. 이렇게 사용합니다.

bunzip2 linux-version.bz2

플로피 디스크 관련

플로피 디스크를 저장매체로 사용하는 경우가 거의 없어져 가고 있지만 가끔 필요한 경우가 있습니다.

mkfs -t ext2 /dev/fd0 1440

플로피 디스크를 리눅스 용으로 포맷하는 명령어입니다. mkfs 는 "make filesystem"입니다. -t 라는 옵션 다음에 새로 만들 파일시스템의 타입을 써 줍니다. 위의 경우 리눅스의 기본 파일시스템인 ext2로 포맷합니다. /dev/fd0은 디바이스 중 플로피를 가리킵니다.

fdformat /dev/fd0

이름처럼 floppy disk(fd)를 "format"하는 명령어입니다. 위 명령어와의 차이점은 로 레벨 포맷(low level format)을 한다는 점입니다.

dd if=/boot/vmlinuz of=/dev/fd0 bs=8192

리눅스 부트 플로피를 만드는 명령어 입니다. /boot/vmlinuz가 바로 리눅스 커널입니다. 이것을 플로피 디스크로 복사하는 것입니다. bs라는 것은 "byte count"입니다. 위 명령어를 풀어서 설명하면, "/boot/vmlinuz/dev/fd0이 존재한다면 /boot/vmlinuz8192 바이트 카운트 단위로 읽어들여서 /xhtml/fd0로 복사해라."입니다.

기타

whoami

내가 누구인지를 묻는 명령어입니다. 현재 로그인한 id를 출력합니다.

su

수퍼유저, 즉 root로 로그인하겠다는 명령어입니다. 일반 유져로 로그인했다가 root로 작업해야 할 필요가 있을 때 사용합니다. 이 명령어를 치면 password:라는 메씨지가 뜨면서 root의 암호를 묻습니다.

반대로, 현재 root로 있는 상태인데 다른 유져로 내려가고 싶다면 su linuxer와 같은 식으로 하면 됩니다.

whereis

어떤 프로그램이 인스톨되어 있는지를 쉽게 알아보는 명령어입니다. 예를 들어 이 설치되어 있는지 알고 싶다면, whereis perl 라고 하면 /usr/bin/perl이라든지, 기타 펄이 있는 위치를 알려 줍니다. 아무 것도 안 나오면 인스톨이 안 되어 있는 것입니다. 비슷한 것으로 which가 있습니다. which perl처럼 사용합니다.

man

명령어 등의 메뉴얼 페이지(man page)를 보여 줍니다. 생소한 명령어에 대해서 자세히 공부하고 싶다면 man 명령어라고 하면 자세한 설명이 나옵니다. man 페이지는 "less"라는 프로그램을 이용해서 디스플레이되므로 man 페이지를 읽는 법은 less 프로그램 사용법과 같습니다. 사용법은 man 페이지가 떠 있는 상태에서 "h" 키를 눌러 보면 자세하게 나옵니다.

tab 키, CTRL-u, CTRL - w

굳이 명령어를 모두 타이핑하지 않아도 명령어를 자동완성(auto completion)하는 방법이 있습니다. 명령어의 처음 몇 자를 친 다음 [tab키]를 누르면 됩니다. 예를 들어, history라는 명령어를 타이핑한다면 굳이 history를 다 칠 필요가 없이 "his"까지만 치고 탭키를 누르면 history로 자동완성됩니다. 타이핑한 글자로 시작되는 명령어가 여러 개인 경우에는 탭 키를 한 번 더 누르면 그 글자로 시작되는 모든 명령어가 다 나타납니다. 예를 들어 pr이라고 치고 탭키를 두 번 누르면 "pr"로 시작되는 모든 명령어를 모두 보여 줍니다.

명령어를 타이핑하다가 다 지우고 다시 시작하려면 백 스페이스 키를 여러 번 누를 필요 없이 [CTRL-u]를 누르면 됩니다. 비슷한 것으로 한 단어만 다시 지우고 싶을 때에는 [CTRL- w]입니다. "u"는 "undo", "w"는 "word"라고 생각하면 쉽게 외울 수 있습니다.

이 정도만 알면 기본적인 작업은 할 수 있습니다. 하지만, 대부분의 명령어에 아주 많은 옵션이 있기 때문에 공부하려고 든다면 명령어 하나를 마스터하는 데에도 며칠씩 걸릴 수 있습니다. 굳이 그렇게 다양한 옵션을 다 외울 필요는 없습니다. 자주 쓰는 명령어의 가장 핵심적인 옵션 한두 개 정도만 알고, 중요한 커맨드(예컨데, find 같은 코맨드는 다양한 옵션을 알면 파일 검색에 아주 큰 도움이 됩니다.)에 대해서 깊게 공부해 두면 됩니다.

이상 공부해 본 레고 블럭을 어떻게 |로 조립해서 사용하는 지는 다른 문서에서 다루겠습니다. 그럼, 즐거운 리눅스 되세요!

지금 계신 곳은: TECH > [리눅스] 리눅스의 기본 명령어들