※ 이 시리즈는 KAIST 바이오및뇌공학과 최정균 교수님의 "[BiS531] 유전체정보학" 강의 내용을 바탕으로 함을 밝힙니다.

 

한 줄에 명령어를 여러 개 입력하는 경우는 두 가지가 있을 수 있다.

 

A) 단순히 여러 개의 명령어를 한 줄에 순서대로 입력해 연속 실행하고 싶다.

B) 앞 명령어의 결과를 뒤따르는 명령어의 인자로 전달하고 싶다.

 

A의 예시는: 디렉토리를 새로 만들고, 그 안에 파일을 복사붙여넣기 하고, 파일 이름을 바꾸겠다.B의 예시는: 이 디렉토리에 존재하는 파일 목록에서 어떤 텍스트를 검색하겠다.

 

B는 전산학에서 말하는 '함수' 개념을 잘 기억해두면 사용하기 용이하다. 수학의 함수가 어떤 두 집합의 원소를 연결하는 방법의 정의인 것과 달리, 전산학의 함수는 '뭔가를 넣으면(input)' '뭔 처리를 해서(process)' '결과물로 뭔가 나온다(output)'는 흐름을 의미한다고 적당히 받아들일 수 있다. 전산학 전공자가 들으면 화낼 거 같구만... 뭔가를 넣을 때 넣지 않을 수도 있고 (void), 뭔 처리를 하는 걸로 작동이 끝나서 딱히 결과물로 뭔가를 돌려주지 않을 수도 있고 (return 0) ... 다양한 경우가 있지만, 대충.B에서 말하는 '인자로 전달하겠다'는 그 명령어(프로그램, 함수)의 input으로 앞 명령어의 output을 집어넣겠다는 의미다.

 

 

각각의 명령어를 작성하는 문법은 아래와 같다.

 

A) 세미콜론 semi-colon (;) 혹은 쌍앰버샌드 double-ampersand (&&)

명령어1 ; 명령어2
# 명령어1이 제대로 실행되거나 말거나 명령어2 실행이 시도된다

명령어1 && 명령어2
# 명령어1의 결과자 True일 때에만 명령어2가 실행된다

명령어1 ; 명령어2 ; 명령어3
# 이어 붙이는 명령어 수에 제한은 없다

 

B) 수직선 vertical bar (|) : piping

QWERTY 키보드 기준으로 역 슬래쉬(\)나 원화 기호(₩) 키에 shift 입력으로 붙어있다.

la -al | grep 검색할_텍스트

이 사용법은 특별히 piping 이라는 이름이 붙어있다. 파이핑! 파이프를 연결하듯 앞 명령어의 output이 뒷 명령어의 input으로 쏙 들어가기 때문에 이런 이름이 붙었다고 한다.

 

 

 

커맨드 라인에서 복잡한 작업을 한꺼번에 처리하기도 좋고, 커맨드 라인의 여러 명령어 입력을 통째로 프로그램으로 작성하는 bash programming 시에도 종종 사용된다.

유용한 기능이므로 용법을 알아두고, 다양하게 생각해 적용해보자!

※ 이 시리즈는 KAIST 바이오및뇌공학과 최정균 교수님의 "[BiS531] 유전체정보학" 강의 내용을 바탕으로 함을 밝힙니다.

 

리눅스에서 어떤 기능을 쓰고 싶다면, 먼저 명령어(커맨드)를 알아야한다.

요새는 인터넷에 검색하면 다 나오지만 내가 맨 처음 리눅스를 접했을 때는 보통 책으로 나온 '리눅스/유닉스 커맨드 사전' 같은 걸 봤던 듯... 그 시절에도 이글루스(폐쇄됨) 같은 블로그 플랫폼에 IT 정보를 올리는 사람은 많았지만, 전산 관련 전공 붐이 일기 전이라 그다지 활발하진 않았던 듯 싶다. 인공지능이나 빅데이터가 큰 일을 해냈구만...

 

커맨드는 알아냈는데 옵션이나 커맨드를 사용하는, 즉 어떤 인자를 전달해서 어떤 결과를 돌려받는지 긴가민가하다면?

일일이 검색하기는 귀찮고, 커맨드 라인에서 직접 커맨드의 용례와 옵션을 볼 수 없을까? 그 기능을 하는 명령어가 man, 그리고 (보통은) 커맨드의 --help, -h, -help 등의 옵션이다.

 

# 명령어(=프로그램) 배포 시 기본적으로 작성하는 설명 문서
# 용도, 프로그램 작성자, 배포자, 기타등등, 자세한 내용이 적혀있다
man 명령어

# 좀더 간략하고 용례나 옵션 위주로 작성된 기술 문서를 열람하는 법
# 명령어 제작/작성자가 도움말 페이지를 저 셋 중 무엇으로 저장했는지는... 모를 일이다
명령어 -h
명령어 --help
명령어 -help

 

어떤 명령어에아직 익숙하지 않을 때에는 틈틈이 man (manual의 약자) 으로 설명을 열어보거나, help 옵션으로 사용가능한 용례를 살펴보는 습관을 들이면 좋다.

※ 이 시리즈는 KAIST 바이오및뇌공학과 최정균 교수님의 "[BiS531] 유전체정보학" 강의 내용을 바탕으로 함을 밝힙니다.

 

 

나는 어디에 있나

리눅스에 처음 접속했다면 일단 내가 어느 디렉토리(경로, 주소)에 있는지 확인해보자.

본인의 컴퓨터에서 리눅스를 실행하든, 서버에 특정 사용자로 접속하든, 보통은 home 디렉토리에 위치해 있게 된다.

아래 명령어로 내가 어디 있는지 알아보자.

pwd

pwd는 Print Workin Directory의 약자로, working directory, 즉 내가 커맨드 라인에 입력하는 명령이 실행되는 위치를 말한다. 명령어에 따라 실행될 위치를 지정할 수 있지만, 별도로 지정하지 않는다면 리눅스는 기본적으로 지금 내가 자리 잡은 이 폴더 내에서 명령을 처리하려 시도한다. 예를 들어 내가 특정 파일을 어떻게 처리하라고 명령을 내렸는데, 그런 이름의 파일이 이 폴더 안에 없다면 오류가 발생하는 식이다.

 

 

다른 디렉토리로 가고 싶다

디렉토리를 파악했다면 다른 디렉토리로는 어떻게 이동할까? 이때는 change directody, 줄여서 cd 커맨드를 사용한다. cd 커맨드에는 몇 가지 팁이 있는데,

cd 절대경로	# 절대경로로 지정한 폴더로 바로 이동
cd ~		# home directory로 이동
cd -		# 바로 직전에 있었던 directory로 이동
cd ..		# 지금 있는 폴더의 바로 상위 폴더로 이동

리눅스에서 물결표(~)는 home directory (로그인하면 바로 들어오게 되는, 리눅스 상에서 사용자마다 주어지는 기본 폴더)의 주소를 요약하는 기호이다. 마이너스(-) 표는 직전에 있었던 주소를 나타낸다. cd 커맨드와 조합하여 사용하면 편리하다.

 

디렉토리 내부의 파일 목록을 보고 싶다

내가 있는 디렉토리에 어떤 파일 혹은 폴더가 존재할까? 윈도우즈나 iOS에서 흔히 사용하는 그래픽 빵빵한 OS에서야 클릭해서 폴더 열고 들여다보면 되지만, 리눅스 커맨드 라인에서는 그럴 수 없지 않은가... ls 커맨드는 기본적으로 내가 현재 위치한 폴더의 구성 요소를 보여준다. ls 명령어 뒤에 다른 디렉토리의 구체적인 주소를 입력하면 그 디렉토리 내부의 파일 폴더 목록을 돌려준다.

ls		# 현재 폴더의 파일/폴더 목록, 숨김파일 비표시
ls -a		# 숨김 파일도 모두 표시
ls -l		# 상세한 정보를 표시
ls -al		# 위의 두 옵션을 합쳐서 숨김 파일폴더도 모두 자세히 표시

ls 절대경로	# 해당 경로의 파일 및 폴더 표시

 

새로운 디렉토리 혹은 파일을 만들고 싶다

새로운 디렉토리나 파일을 만드는 방법을 알아보자. 폴더는 make directory 명령어 즉 mkdir로 생성한다.

mkdir 폴더이름

파일을 만드는 방법은 다양한데, 첫 번쨰로 mkdir 명령어의 옵션을 사용할 수 있고,

mkdir -p 파일이름	# mkdir 명령어의 p 옵션

어떤 파일의 내용을 출력하는 cat 명령어를 이용해 그 출력 내용을 꺾쇠 (>) 방향의 파일로 '내보낸다'는 이미지다. 리눅스에는 꺽쇠 (<, >), 이중꺾쇠 (<<, >>) 등으로 명령어 처리 결과를 파일로 작성하는 특수문자 기능이 할당되어 있으니 활용하면 좋다.

cat > 파일이름

또 다른 명령어는 파일의 생성/편집 날짜를 지금 컴퓨터에 저장된 시간으로 덮어씌우는 touch 명령어인데, 이 명령어에 인자로 '디렉토리에 없는 파일'의 이름을 전달하면 0 바이트짜리 해당 파일을 현재 시간에 생성해버린다. 약간 '그렇게 쓰라고 만든 명령어 아닌데...' 싶은 용법이지만...

touch 디렉토리에_없는_파일이름

마지막으로 텍스트 에디터... 윈도우즈로 치면 메모장 같은 리눅스 프로그램인 vi 혹은 vim을 이용한 생성법이다. 이 명령어는 vi/vim으로 '그 이름의 파일을 열어라'라는 명령을 컴퓨터에 전달하고, 해당 디렉토리에 그런 이름의 파일이 없다면 새 파일을 연다. touch와 다른 점은, 마치 우리가 워드프로세서에서 '새 파일'을 만드는 것과 같이, 저장하지 않으면 파일이 날아간다는 것이다.

vi 파일이름
vim 파일이름

vi/vim 파일 에디터는 고유의 조작법을 가지고 있기 때문에 약간 공부가 필요하다. 일단 새 파일을 만들면 '읽기 모드 (실은 명령 모드)' 상태로, 내용을 입력하려면 INSERT 기능키나 알파벳 i키로 '입력 모드'로 전환된다. 일단 입력모드가 되면 ESC(escape) 키로 다시 명령 모드로 돌아오는데, 명령 모드에서 콜론(:), 슬래쉬(/), 물음표(?)를 먼저 입력한 후 명령어를 뒤따라 입력하면 작동한다.

:q	# vi, vim 텍스트 에디터 종료

:q!	# ! 붙은 명령을 강제 실행
	# 이 경우 저장 없이 강제 종료
    
:w	# 편집 내용 저장

:wq	# 편집 내용 저장 후 나가기
	# 순서대로 실행하므로 qw로 순서가 바뀌면 안된다

우리는 파일을 만들고 싶으므로, vi/vim 명령어로 연 파일을 저장(:w)해야한다.

이 위에서 생성한 파일을 전부 기본적으로 텍스트 파일임을 잊지 말자. 우리가 접속한 리눅스 컴퓨터는... 물론 GUI를 제공하는 경우도 있지만, 대체로 커맨드 라인에 의존적으로 파일을 다루고, 그 작업의 대상은 텍스트 파일이다.

 

파일이나 디렉토리를 삭제하고 싶다

파일이나 디렉토리의 삭제는 remove를 줄인 rm 커맨드를 사용한다. 기본적으로 rm 커맨드는 '파일'만 대상으로 하기 때문에 디렉토리를 삭제하려면 recursive(재귀적)으로 삭제하라고 옵션을 추가하거나, 아예 전용 명령어인 rmdir을 사용할 수 있다. 그런데 이때 또 골 때리는 게... rmdir 명령어는 '디렉토리를 삭제'하는 게 기본 기능이라 디렉토리(폴더)에 파일이 들어있다면 삭제하지 못한다. 옵션을 주면 디렉토리 내부에 파일이 있어도 무시하고 삭제한다.

rm 파일이름
rm -r 디렉토리	# 해당 디렉토리의 하위 디렉토리를 포함해 모두 삭제
rm -f 파일	# 사용자 확인이 필요하거나 중요한(보호된) 파일도 강제로 삭제

여기서 나오는 리눅스 초보자 괴담... 마치 비행기 탈 때는 신발을 벗으라거나 입대할 때 PX에서 소총을 개인이 구매해야한다는 부류의 농담이 나오는데...

아래 명령어는 절대로 하면 안된다.

cd /		# root 디렉토리로 이동
rm -rf *	# 이하 모든 파일/폴더를 강제로 삭제

설명하자면 리눅스의 모든 구성요소를 강제로 삭제하겠다는 소리다. 컴퓨터 먹통된다. 하면 안된다. root 사용자 권한(윈도우즈로 따지면 관리자 권한 비슷한데 리눅스에선 훨씬 강력하다.)을 취득하지 않은 사용자가 root 디렉토리에서 명령을 내려봤자 실행되지는 않지만, 하면 안된다.

 

rmdir 명령어는 빈 디렉토리를 삭제하고, 옵션을 주면 비지 않은 디렉토리의 경우 포함된 파일도 삭제한다.

rmdir 빈_디렉토리
rmdir -r 디렉토리	# 비지 않은 디렉토리도 삭제

 

파일이나 디렉토리를 이동, 혹은 복사하고 싶다

파일을 이동하는 방법은

mv 원래_파일_주소 이동할_위치

이 기능은 원본 파일을 복사해 후자의 위치에 붙여넣고 원본 파일을 삭제하는 순서로 이뤄진다. mv 명령어는 파일 - 도착 디렉토리로 짝지어 작동하기도 하고, 파일 - 파일로 짝지어 사용할 수도 있다. 이 경우

mv 디렉토리1/파일1 디렉토리2/파일2
# 디렉토리1에 있던 파일1을 디렉토리2에 있는 파일2로 만든다

즉, 파일의 이름을 바꾸는 데에도 쓸 수 있다!  파일이나 디렉토리 이름을 바꾸는 전용 명령어는 rename 이지만, mv로도 가능하다. '아니, 원래 그 기능을 하는 커맨드가 아니지 않나?' 싶어도 어쨌거나 내가 바라는 결과가 나오니까, 여러 명령어를 알아두면 좋다. 사람마다 취향껏 골라 쓰는 듯?

 

파일을 복사하는 방법은 copy를 줄인 cp 커맨드를 쓴다.

cp 디렉토리1/파일1 디렉토리2
# 파일1을 복사해서 디렉토리2에 파일1이란 이름의 파일을 새로 만든다

cp 디렉토리1/파일1 디렉토리2/파일2
# 파일1을 복사해서 디렉토리2의 파일2라는 이름으로 붙여넣는다

cp 커맨드도 파일 - 디렉토리 쌍으로 혹은 파일 - 파일 쌍으로 사용한다. 전자는 원본 파일 이름을 보존하여 복사 붙여넣기, 후자는 이름을 바꾸어 붙여넣는다.

 

+ Recent posts