디렉토리와 파일 2

타키탸키·2021년 4월 5일
0
post-thumbnail

지난 시간에는 디렉토리에 접근하고 이동하는 커맨드들을 살펴봤습니다.

이번 시간에는 디렉토리 내부를 둘러보고 디렉토리 속 파일을 다뤄보도록 하겠습니다.

📂 디렉터리 내부 살펴보기

하나의 디렉토리 안에는 자식 디렉토리 혹은 파일들이 들어있습니다. 이와 같은 디렉토리 내부를 보고 싶다면 ls라는 커맨드를 사용하면 됩니다. ls는 리스트(list)의 약어로 현재 디렉토리 안에 자식 디렉토리나 파일들의 리스트를 보여줍니다.

위 결과는 tataki26의 홈 디렉토리 안에 있는 자식 디렉토리와 파일들의 이름을 보여줍니다. 이때, 이름 말고 다른 정보들도 보고 싶다면 -l 옵션을 주면 됩니다. 이는 long lising format 즉, 결과를 긴 리스트 형식으로 보여달라는 뜻입니다.

출력 결과가 훨씬 복잡해졌죠? 여기에는 디렉토리와 파일의 크기, 최종 수정 날짜 같은 상세 정보들이 나타나 있습니다.

다음으로 또 다른 ls 옵션인 -a에 대해 알아보겠습니다. 이는 모든 것을 나타내는 all의 약어로, 숨겨져 있는 자식 디렉토리나 파일을 볼 수 있습니다.

유닉스에서는 디렉토리나 파일의 이름 앞에 점 하나를 붙이면 ls 커맨드를 썼을 때 나타나지 않습니다. 이를 숨겨진 디렉토리 혹은 숨겨진 파일이라고 부릅니다. 보통 수정할 필요가 없는 설정 파일 등이 숨겨진 경우가 많습니다.

ls만 입력했을 때보다 더 많은 결과가 나타납니다. 이 중 앞에 점이 붙은 항목들이 숨겨진 파일이나 디렉토리를 나타냅니다. ls -a -l을 통해 자세한 정보도 함께 출력해봅시다.

숨겨진 파일과 동시에 자세한 정보도 함께 출력되었습니다. 이는 l과 a의 자리를 바꿔도 마찬가지입니다. 또한, 옵션이 여러 개 있을 때는 하이픈 하나로 모아서 실행이 가능합니다. ls -al처럼 말이죠.

📂 ls의 인자

이번에는 ls의 인자를 살펴봅시다. 출력 결과의 파일 하나를 지정해서 그 파일의 이름을 인자로 사용해보겠습니다.

ls .cache


이 파일의 자세한 정보들도 함께 볼까요?

ls -l .cache

이렇게 특정 파일의 자세한 정보를 보고 싶으면 l 옵션과 함께 그 파일의 이름을 인자로 주면 됩니다. 디렉토리도 마찬가지로 이름을 인자로 주고 옵션을 주면 됩니다.

사실 l 옵션은 내용을 보여달라는 뜻을 가지고 있습니다. 그렇다면 디렉토리 자체의 정보를 보고 싶으면 어떻게 해야할까요? -d 옵션을 사용하면 됩니다. 이는 directory의 약자입니다. 옵션이 여러 개이기 때문에 붙여서 입력하겠습니다.

ls -ld Pictures

📂 다양한 파일의 종류

ls -l을 하면 디렉토리의 자세한 정보를 알 수 있었죠?

이들 중 어떤 항목은 d로 시작하고 또 다른 항목은 -으로 시작합니다. d디렉토리를, 하이픈파일을 의미합니다.

유닉스에는 다양한 종류의 파일이 있습니다. 사실 디렉토리도 넓은 의미에서 파일의 한 종류로 취급 되는데요. 그 이유를 알기 위해서는 파일 시스템이라는 부분을 따로 공부해야 합니다. 그러니 일단은 디렉토리도 파일의 한 종류라는 것만 알아두도록 하죠.

d와 하이픈 외에도 파일의 종류를 나타내는 다양한 문자들이 들어갈 수 있습니다. 이들을 표로 함께 보겠습니다.

그런데 아직은 낯선 단어들이 많이 보입니다. 당장은 이들을 알 필요가 없습니다. 그러려면 유닉스를 좀 더 깊게 배워야 할 테니까요. 따라서, 당장은 d와 하이픈의 의미, 그리고 다양한 종류의 파일이 있다는 것만 알아두시면 됩니다.

📂 디렉토리와 파일 만들기

이번에는 직접 디렉토리와 파일을 만들어 봅시다. 먼저, 디렉토리를 만드려면 mkdir이라는 커맨드를 사용해야 합니다. 이는 make directory 즉, 디렉토리 만들기를 의미합니다. 인자로는 만들고자 하는 디렉토리의 이름을 주면 됩니다.

mkdir parent


그럼 보시는 바와 같이 parent라는 이름의 디렉토리가 홈 디렉토리 안에 생성된 것을 알 수 있습니다.

다음으로 새로 만든 parent 디렉토리 안에 child라는 디렉토리를 생성해 보겠습니다. 그러기 위해서는 먼저 parent 디렉토리로 이동해야 할 것 같은데요. 사실 그럴 필요 없습니다. mkdir의 인자로 새로 만들고 싶은 디렉토리의 경로를 지정해줄 수 있으니까요.

mkdir parent/child

이처럼 mkdir 뒤에 경로를 지정하고 새로 만들고 싶은 디렉토리의 이름을 적어주면 그 경로 안에 새 디렉토리를 생성할 수 있습니다.


parent 디렉토리에서 ls 커맨드를 입력하면 성공적으로 child 디렉토리가 생성된 것을 알 수 있습니다.

이번에는 파일을 새로 만들 건데요. touch라는 커맨드를 사용하면 됩니다. 마찬가지로 인자로는 만드려는 파일의 이름을 적어주면 됩니다.

touch test

📂 디렉토리와 파일 이동 및 이름 변경

방금 생성한 test 파일을 다른 디렉토리로 이동해보겠습니다. 디렉토리나 파일을 옮기려면 move의 약어인 mv 커맨드를 사용하면 됩니다. 인자로는 첫번째로 옮기고 싶은 파일 이름, 두번째로 경로를 적어주면 됩니다.

mv test child


test 파일을 child로 옮겨준 후 parent의 내부를 보면 child만 보입니다. child 디렉토리로 이동해서 내부를 보면 test가 들어있는 것을 확인할 수 있습니다.

다시 parent로 돌아옵니다. 이번에는 child 디렉토리를 홈 디렉토리로 옮겨 보겠습니다. 마찬가지로 옮기려는 디렉토리명과 경로를 적어주면 되는데요. 이번에는 절대 경로를 사용해 보겠습니다.

mv child /home/tataki26

만약 상대 경로를 사용하고 싶으면 경로 인자로 ..만을 적어주면 됩니다. 참 간단하죠?


홈 디렉토리로 와서 내부를 살펴보면 child가 성공적으로 이동한 것을 확인해볼 수 있습니다. 다시 child 디렉토리를 parent 디렉토리로 이동시키겠습니다.

mv child parent

사실 mv 커맨드에는 디렉토리와 파일 이동 말고도 다른 기능이 하나 더 있습니다. 바로 이름 변경인데요. 인자로는 변경하고 싶은 파일의 이름새 이름을 적어주면 됩니다.

child 디렉토리로 이동해서 child 안에 있는 test 파일의 이름을 sample로 변경해주었습니다. 다시 child의 내부를 보면 test 파일이 아닌 sample 파일이 들어있는 것을 확인해볼 수 있습니다.

디렉토리 이름도 변경해볼까요? 파일과 마찬가지로 인자를 주면 됩니다.

parent 디렉토리로 이동해서 child 디렉토리의 이름을 kid로 변경했습니다. parent의 내부를 살펴보면 child가 아닌 kid 디렉토리가 들어있는 것을 확인해볼 수 있습니다.

📂 mv 커맨드의 동작 방식

mv 커맨드에는 두 가지 기능이 있다고 했죠? 바로 디렉토리와 파일을 이동시키는 기능과 이름을 변경하는 기능입니다. 그런데 이 두 기능을 어떻게 구분해서 실행할 수 있을까요?

❗ 파일을 옮기는 경우

mv file DEST

DEST가 나타내는 경로가 이미 존재하는 디렉토리라면 그 디렉토리 안으로 file이 이동합니다.

DEST가 나타내는 경로가 아직 존재하지 않는 경로라면 그 경로명대로 이름 변경 혹은 위치 이동, 혹은 둘 다도 가능합니다. 예를 들어, DEST가 file2이름만 file2로 바뀝니다. 하지만 DEST가 ../file(동일한 파일명)이라면 위치 이동만 합니다. 마지막으로 DEST가 ../file2(다른 파일명)라면 이름 변경도 되고 위치 이동도 합니다.

mv test child

우리가 test를 child 디렉토리로 이동시킬 수 있었던 이유는 child라는 디렉토리가 이미 존재하고 있었기 때문입니다. 만약 child가 존재하지 않는 디렉토리였다면 test의 이름을 child로 변경하게 됩니다.

주의해야 할 점은 이동하게 되는 디렉토리 안에 DEST와 같은 이름의 파일이 이미 있다면 그 파일을 덮어쓰게 된다는 것입니다. 이런 일을 방지하려면 mv 커맨드를 사용할 때, -i 옵션을 주면 됩니다. 이는 interactive의 약어로 혹시 덮어쓰게 될 상황이 생기면 바로 덮어쓰지 않고 사용자의 의견을 물어봅니다.

mv -i file ../alreadyExists

이런 식으로 적어주면 됩니다. 그럼 터미널에서 overwrites ../alreadyExists?가 출력되면서 덮어쓸 건지를 물어봅니다. 이때, y(yes)를 입력하면 덮어쓰고 n(no)를 입력하면 아무 일도 일어나지 않습니다.

❗ 디렉토리를 옮기는 경우

mv dir DEST

DEST가 나타내는 경로가 이미 존재하는 디렉토리라면 그 디렉토리 안으로 dir가 이동합니다.

DEST가 나타내는 경로가 아직 존재하지 않는 경로라면 그 경로명대로 이름 변경 혹은 위치 이동, 혹은 둘 다도 가능합니다. 예를 들어, DEST가 dir2면 이름만 dir2로 바뀝니다. 하지만 DEST가 ../dir(동일한 디렉토리명)라면 위치 이동만 합니다. 마지막으로 ../dir2(다른 디렉토리명)라면 이름 변경도 되고 위치 이동도 합니다.

여기서 잠깐! DEST가 이미 존재하는 파일의 이름이라면 어떻게 될까요? 이렇게 되면 에러 메세지가 출력되면서 아무 것도 일어나지 않습니다. 왜냐하면 하나의 디렉토리 안에는 같은 이름의 디렉토리나 파일이 존재할 수 없기 때문이죠.


이번 시간에는 디렉토리 내부를 살펴볼 수 있는 ls 커맨드와 함께 사용할 수 있는 인자와 옵션, 그리고 디렉토리와 파일을 이동하고 이름을 변경할 수 있는 mv 커맨드에 대해 배웠습니다.

mv 기능이 여러 개인만큼 헷갈리기가 쉽습니다. 중요한 개념인만큼 연습을 통해 익혀두시길 바랍니다.

다음 시간에는 디렉토리와 파일 마지막 시간! 디렉토리와 파일을 복사 붙여넣기 하고 삭제, 그리고 출력까지 해보는 시간을 가져보겠습니다.

* 이 자료는 CODEIT의 '유닉스 커맨드 라인' 강의를 기반으로 작성 되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글