유닉스 쉘(Unix Shell)

파일과 디렉토리 생성

학습 목표

  • 주어진 도표에 매칭되도록 계층적으로 디렉토리 구조 생성한다.
  • 편집기 혹은 이미 만들어진 파일을 복사하거나 이름을 바꾸어서 상기 계층적 디렉토리에 파일을 생성한다.
  • 명령-라인을 사용해서 디렉토리의 내용 화면에 출력한다.
  • 특정 파일과 디렉토리 혹은 각각을 따로 삭제한다.

이제는 어떻게 파일과 디렉토리를 살펴보는지 알게 되었지만, 우선, 어떻게 파일과 디렉토리를 생성할 수 있을까요? Nelle의 홈 디렉토리, /Users/nelle, 로 돌아가서 ls -F 명령어를 사용하여 무엇을 담고 있는지 살펴봅시다:

$ pwd
/Users/nelle
$ ls -F
creatures/  molecules/           pizza.cfg
data/       north-pacific-gyre/  solar.pdf
Desktop/    notes.txt            writing/

명령어 mkdir thesis을 사용하여 새 디렉토리 thesis를 생성합시다 (출력되는 것은 아무것도 없습니다.):

$ mkdir thesis

이름에서 유추를 할 수도, 하지 못할 수도 있지만, mkdir은 “make directory(디렉토리 생성하기)”를 의미한다. thesis는 상대 경로여서(즉, 앞에 슬래쉬가 없음), 새로운 디렉토리는 현재 작업 디렉토리 아래 만들어진다:

$ ls -F
creatures/  north-pacific-gyre/  thesis/
data/       notes.txt            writing/
Desktop/    pizza.cfg
molecules/  solar.pdf

하지만 thesis 디렉토리에는 아직 아무것도 없다:

$ ls -F thesis

cd 명령어를 사용하여 thesis로 작업 디렉토리를 변경하자. Nano 텍스트 편집기를 실행해서 draft.txt 파일을 생성하자:

$ cd thesis
$ nano draft.txt

텍스트 몇 줄을 타이핑하고, 컨트롤+O (Control-O)를 눌러서 데이터를 디스크에 쓰면 저장된다:

Nano 작업화면

Nano 작업화면

파일이 저장되면, 컨트롤+X (Control-X)를 사용하여 편집기를 끝내고 쉘로 돌아간다. (유닉스 문서에서 ^A로 줄여서 “컨트롤+A(control-A)”를 표기한다.) nano는 화면에 어떤 출력도 뿌려주지 않고 끝내지만, ls 명령어를 사용하여 draft.txt 파일이 생성된 것을 확인할 수 있다:

$ ls
draft.txt

rm draft.txt을 실행해서 깨끗이 정리합시다:

$ rm draft.txt

이 명령문은 파일을 제거한다. (“rm”은 “remove”를 줄였다.) ls를 다시 실행하면, 화면에 출력되는 것은 없고 파일이 사라진 것을 확인할 수 있다:

$ ls

파일을 다시 생성하고 나서, cd ..를 사용하여 /Users/nelle 상위 디렉토리로 이동해보자:

$ pwd
/Users/nelle/thesis
$ nano draft.txt
$ ls
draft.txt
$ cd ..

rm thesis을 사용하여 전체 thesis 디렉토리를 제거하려고 하면 오류 메시지가 생긴다:

$ rm thesis
rm: cannot remove `thesis': Is a directory

rm 명령어는 파일에만 동작하고 디렉토리에는 동작하지 않기 때문에 오류가 발생한다. 올바른 명령어는 rmdir이고 “remove directory(디렉토리 제거하기)”를 줄여서 표현한다. 하지만 이것도 동작하지 않는데 이유는 삭제하려는 디렉토리가 비어있지 않기 때문이다:

$ rmdir thesis
rmdir: failed to remove `thesis': Directory not empty

이러한 작은 안전 기능이 정말 많은 사람을 슬픔으로부터 구원해줬다. 특히, 여러분이 타이핑에 초보라면 더욱 그렇다. thesis 디렉토리를 제거하려면, 먼저 draft.txt 파일을 삭제해야 된다:

$ rm thesis/draft.txt

이제 디렉토리가 비워져서, rmdir 명령어로 삭제할 수 있다:

$ rmdir thesis

다시 한번 디렉토리와 파일을 생성하자. 이번에는 thesis/draft.txt 경로에서 nano를 실행함을 주목하자. 이전에는 thesis디렉토리로 가서 draft.txtnano를 실행했다.

$ pwd
/Users/nelle
$ mkdir thesis
$ nano thesis/draft.txt
$ ls thesis
draft.txt

draft.txt가 특별한 정보를 제공하는 이름이 아니어서 mv를 사용하여 파일 이름을 변경하자. mv는 “move”의 줄임말이다:

$ mv thesis/draft.txt thesis/quotes.txt

첫 번째 매개변수는 mv 명령어에게 이동하려는 대상을, 두번째 매개변수는 어디로 이동되는지를 나타낸다. 이번 경우에는 thesis/draft.txt 파일을 thesis/quotes.txt으로 이동한다. 이렇게 파일을 이동하는 것이 파일 이름을 바꾸는 것과 동일한 효과를 가진다. 아니나 다를까, ls 명령어를 사용하여 thesis 디렉토리에 이제 quotes.txt 파일만을 가지고 있음을 확인할 수 있다:

$ ls thesis
quotes.txt

목표 파일명을 명세할 때 주의를 기울일 필요가 있다. 왜냐하면, mv 명령어는 동일 명칭을 갖는 어떤 기존 파일도 아주 조용히 덮어 써버려 데이터 손실에 이르게 된다. 부가적인 옵션 플래그, mv -i (즉 mv --interactive)를 사용해서 덮어쓰기 전에 사용자가 확인하도록 mv 명령어를 활용한다.

일관성이 없어, mv는 디렉토리에도 동작한다 — 별도 mvdir 명령어는 없다.

quotes.txt 파일을 현재 작업 디렉토리로 이동합시다. mv를 다시 사용한다. 하지만 이번에는 두번째 매개변수로 디렉토리 이름을 사용해서 파일이름을 바꾸지 않고, 새로운 장소에 놓는다. (이것이 왜 명령어가 “move(이동)”으로 불리는 이유다.) 이번 경우에 사용되는 디렉토리 이름은 앞에서 언급한 특수 디렉토리 이름 . 이다.

$ mv thesis/quotes.txt .

과거에 있던 디렉토리에서 파일을 현재 작업 디렉토리로 옮긴 효과가 나타난다. ls 명령어가 thesis 디렉토리가 비였음을 보여준다:

$ ls thesis

더 나아가, ls 명령어를 매개변수로 파일 이름 혹은 디렉토리 이름을 사용하면, 그 해당 파일 혹은 디렉토리만 화면에 보여준다. 이것을 사용하면, quotes.txt 파일이 현재 작업 디렉토리에 있음을 볼 수 있다:

$ ls quotes.txt
quotes.txt

cp 명령어는 mv 명령어와 거의 동일하게 동작한다. 차이점은 이동하는 대신에 복사한다는 점이다. 매개변수로 경로를 두개 갖는 ls 명령어로 제대로 작업을 했는지 확인할 수 있다. 대부분의 유닉스 명령어와 마찬가지로, ls 명령어에 한번에 경로 수천개가 주어질 수 있다:

$ cp quotes.txt thesis/quotations.txt
$ ls quotes.txt thesis/quotations.txt
quotes.txt   thesis/quotations.txt

복사를 제대로 수행했는지 증명하기 위해서, 현재 작업 디렉토리에 있는 quotes.txt 파일을 삭제하고 동일한 ls 명령어를 실행한다.

$ rm quotes.txt
$ ls quotes.txt thesis/quotations.txt
ls: cannot access quotes.txt: No such file or directory
thesis/quotations.txt

이번에는 현재 디렉토리에서 quotes.txt 파일은 찾을 수 없지만, 삭제하지 않은 thesis 폴더의 복사본은 찾아서 보여준다.

파일 이름 바꾸기

Suppose that you created a .txt file in your current directory to contain a list of the statistical tests you will need to do to analyze your data, and named it: statstics.txt

After creating and saving this file you realize you misspelled the filename! You want to correct the mistake, which of the following commands could you use to do so?

  1. cp statstics.txt statistics.txt
  2. mv statstics.txt statistics.txt
  3. mv statstics.txt .
  4. cp statstics.txt .

이동과 복사

아래 보여진 일련의 명령문에 뒤에 ls명령어의 출력값은 무엇일까요?

$ pwd
/Users/jamie/data
$ ls
proteins.dat
$ mkdir recombine
$ mv proteins.dat recombine
$ cp recombine/proteins.dat ../proteins-saved.dat
$ ls
  1. proteins-saved.dat recombine
  2. recombine
  3. proteins.dat recombine
  4. proteins-saved.dat

디렉토리와 파일 조직화

정훈이가 프로젝트 작업을 하고 있는데, 작업 파일이 그다지 잘 조직적으로 정리되지 않음을 알게 된다:

$ ls -F
analyzed/  fructose.dat    raw/   sucrose.dat

fructose.datsucrose.dat 파일은 자료분석 결과 산출된 출력결과를 담고 있다. 이번 학습에서 배운 어떤 명령어를 실행해야, 아래 명령어를 실행했을 때 다음에 보여지는 출력을 생성할까요?

$ ls -F
analyzed/   raw/
$ ls analyzed
fructose.dat    sucrose.dat

다수 파일명 복사하기

다음과 같이 몇개의 파일 이름과 디렉토리 이름이 주어졌을 때, cp 명령어는 무엇을 수행할까요?

$ mkdir backup
$ cp thesis/citations.txt thesis/quotations.txt backup

다음과 같이 세개 혹은 그 이상의 파일 이름이 주어졌을 때 cp는 무엇을 수행할까요?

$ ls -F
intro.txt    methods.txt    survey.txt
$ cp intro.txt methods.txt survey.txt

재귀적으로 시간순으로 목록 출력하기

ls -R 명령어는 디렉토리의 내용을 재귀적으로 화면에 출력한다. 즉, 하위 디렉토리, 하위의 하위 디렉토리 등등 알파벳 순으로 계층적 수준으로 뿌려준다. ls -t 명령어는 마지막 변경사항의 시간 순으로 내용을 화면에 출력한다. 즉, 가장 최근에 변경된 파일 혹은 디렉토리를 먼저 정렬하여 화면에 뿌려준다. ls -R -t은 파일과 디렉토리를 어떤 순서로 화면에 보여줄까요?