디렉토리와 파일

타키탸키·2021년 4월 2일
0

저번 시간에는 date, cal과 같은 기본적인 커맨드와 인자와 옵션 등을 배우며 CLI의 첫 걸음을 떼었습니다.

이번 시간에는 경로를 확인하고 변경할 수 있는 디렉토리에 대해 자세히 배워보겠습니다.

📁 경로 확인하고 변경하기

현재 위치현재 머물고 있는 폴더를 말합니다. 유닉스에서는 이 폴더라는 개념을 디렉토리(directory)라고 부릅니다. 그럼 이제부터 이 디렉토리를 확인해보겠습니다.

사실 디렉토리는 터미널을 실행하자마자 알 수 있는데요. ~ 표시가 보이시나요? 이 표시는 틸드(Tilde)라고 부릅니다. 우리가 흔히 물결표라고 부르는 바로 그 표시입니다. 틸드는 현재 사용자의 홈 디렉토리를 말합니다.

현재 사용자는 지금 컴퓨터를 사용하고 있는 사용자를 뜻합니다. 컴퓨터를 켜면 여러 사용자 계정이 있는 경우가 있습니다. 이때, 어느 사용자로 로그인하는지에 따라 현재 사용자가 달라집니다. 그리고 각 사용자마다 설정이나 설치 프로그램을 다르게 할 수 있습니다.

그렇다면 홈 디렉토리는 무엇일까요? 유닉스에서 사용자는 자신만의 디렉토리를 하나씩 가집니다. 사용자는 그 디렉토리에 필요한 파일이나 또 다른 디렉토리를 저장합니다. 이러한 디렉토리가 바로 홈 디렉토리입니다.

다시 말해, 마치 집 안에 자신의 물건들을 넣어두는 것처럼 자신이 필요한 것을 넣는 디렉토리를 홈 디렉토리라고 합니다.

만약 ~ tataki26$ 이렇게 되어 있다면 이 틸드는 현재 사용자 tataki26의 홈 디렉토리에 있다는 것을 뜻합니다. 앞으로 현재 위치가 바뀔 때마다 이 부분이 변합니다.

또 다른 방법이 하나 있습니다. 바로 pwd 커맨드를 입력하는 건데요.

/home/tataki26

그럼 이렇게 현재 작업 중인 디렉토리의 이름이 출력됩니다. pwd는 'Print the name of Working Directory'의 약자입니다. 이는 현재 작업 중인 디렉토리를 출력하라는 뜻을 가지고 있습니다.

위 결과가 사용자 tataki26의 홈 디렉토리의 위치를 나타낸 것이므로 ~와 위 결괏값은 서로 같은 뜻입니다.

위 결괏값을 자세히 설명드리자면 맨 앞에 있는 슬래쉬(/)가장 상위에 있는 디렉토리, 최상위 디렉토리 혹은 루트 디렉토리를 의미합니다. 모든 디렉토리와 파일은 바로 이 루트 디렉토리 안에 있습니다.

유닉스 시스템은 이 루트 디렉토리를 정점으로 그 밑에 계속해서 디렉토리가 디렉토리를 포함하고 있는 구조로 되어 있습니다. 어떤 디렉토리가 다른 디렉토리를 포함하고 있을 때, 포함하고 있는 디렉토리를 '부모(혹은 상위) 디렉토리', 포함되고 있는 디렉토리를 '자식(혹은 하위) 디렉토리'라고 합니다.

슬래쉬 다음의 home은 home이라는 디렉토리를 나타냅니다. 그리고 다음 슬래쉬 뒤의 tataki26는 tataki26라는 디렉토리를 나타내구요. 따라서, 홈 디렉토리의 이름이 바로 tataki26 입니다. 보시는 바와 같이 일반적으로 사용자와 사용자의 홈 디렉토리 이름이 서로 같습니다.

이렇게 현재 디렉토리를 확인해봤는데요. 이러한 디렉토리의 위치 혹은 파일 위치경로라고 부릅니다.

이번에는 다른 디렉토리로 이동해보겠습니다. cd라는 커맨드를 사용해볼건데요. cd는 'Change Directory'의 약어로 디렉토리를 변경한다는 뜻입니다. 이때, 가고 싶은 경로를 cd의 인자로 주면 됩니다.

cd /home/tataki26/Pictures

그럼 이렇게 Pictures로 경로가 이동된 것을 확인할 수 있습니다. pwd로 확인하면 이렇게 나옵니다.

/home/tataki26/Pictures

📁 절대 경로와 상대 경로

경로를 나타내는 방식은 두 가지가 있습니다. 하나는 절대 경로고, 다른 하나는 상대 경로입니다.

우선, 절대 경로루트 디렉토리를 기준으로 어떤 파일이나 디렉토리가 가지고 있는 고유한 경로를 말합니다. 절대 경로는 슬래쉬로 디렉토리를 구분하는 형태로 되어 있습니다.

/home/tataki26/Pictures

위는 루트 디렉토리 안에, home 디렉토리 안에, tataki26 디렉토리 안에 있는 Pictures 디렉토리를 의미합니다.

이에 반해, 상대 경로는 자신의 현재 위치를 기준으로 나타낸 경로를 말하는데요. 상대 경로를 이해하기 위해서는 먼저 ...에 대해 알아야 합니다.

.현재 위치한 디렉토리를 의미합니다. 현재 위치가 /home/tataki26라면 /home/tataki26/Pictures./Pictures로 나타낼 수 있습니다.

주의할 점은 상대 경로는 현재 위치를 기준으로 하기 때문에 만약 현재 위치가 Documents가 되면 .이 Documents를 가리키면서 결과적으로 ./Pictures/home/tataki26/Documents/Pictures가 됩니다. 절대 경로는 여전히 /home/tataki26/Pictures인데 말입니다.

만약 현재 위치가 /home/tataki26/Documents인 상황에서 상대 경로를 이용해 Picutres 디렉토리로 이동하고 싶다면 ..을 활용해야 합니다. ..현재 디렉토리를 포함하고 있는 부모 디렉토리를 의미하기 때문입니다. 따라서, ..은 Documents의 부모 디렉토리인 /home/tataki26를 의미하고 Pictures로 이동하려면 ../Pictures로 나타내야 합니다.

...상대적인 개념이기 때문에 현재 위치가 달라지면 그 의미도 달라집니다.

📁 상대 경로의 유용성

그렇다면 현재 위치가 바뀔 때마다 매번 경로를 수정해야 하는 이 번거로운 상대 경로를 사용하는 이유는 무엇일가요? 때로는 상대 경로가 절대 경로보다 더 유용할 때가 있기 때문입니다.

먼저, 만약 현재 경로가 루트 디렉토리에서 멀리 있는 상황에서 그 주변의 경로를 나타내야 할 때는 상대 경로를 쓰면 더 쉽게 나타낼 수 있습니다.

예를 들어 현재 경로가

/home/tataki26/programming/python

이라면, 절대 경로는 모든 경로를 적어야 하지만 상대 경로는 ../python만으로 표현이 가능합니다.

다음으로, 어떤 프로그램의 호환성을 좋게 하려면 그 프로그램의 소스 코드 내에서는 상대 경로를 써야 합니다. 예를 들어, 이런 상황을 가정해봅시다.

사용자 tataki26의 홈 디렉토리 안에는 '포켓몬 게임'을 위한 Poketmon이라는 디렉토리가 있습니다. 그 안에는 게임 실행 프로그램인 start_game과 start_game 파일이 실행될 때 필요로 하는 설정 파일들이 들어있는 settings라는 디렉토리가 있습니다. 그리고 settings 디렉토리 안에 있는 파일 중에는 캐릭터에 관한 설정을 할 수 있는 character_setting 파일이 들어 있습니다.

정리하면 다음과 같은 디렉토리와 파일이 있는 건데요.

  1. /home/tataki26/Poketmon 디렉토리
  2. /home/tataki26/Poketmon/start_game 파일
  3. /home/tataki26/Poketmon/settings 디렉토리
  4. /home/tataki26/Poketmon/settings/character_setting 파일

이 상황에서 start_game의 소스 코드 중에 character_setting 파일을 가리키기 위한 절대 경로를 사용한 부분이 있다고 합시다.

혼자만 하기 위해 만든 게임이라면 파일의 경로를 절대 경로로 두어도 문제가 없습니다. 하지만 이 게임을 배포하게 된다면 다른 사용자에게 Poketmon 디렉토리를 넘겨줘야 할 텐데요. 이때부터 문제가 발생합니다.

다른 사용자가 홈 디렉토리에 Poketmon 디렉토리를 둘 경우, character_setting 파일의 절대 경로는

/Users/others/Poketmon/settings/character_setting

이 됩니다. 그럼 앞서 절대 경로로 작성했던 코드 부분에서 에러가 납니다. 왜냐하면 다른 사용자의 컴퓨터에는 tataki26라는 디렉토리가 없기 때문이죠.

이럴 때는 어떻게 해야 할까요? 방법은 매우 쉽습니다. start_game을 기준으로 둔 상대 경로를 나타내기만 하면 됩니다. 이런 식으로요. ../settings/character_setting

이렇게 나타내면 더 이상 에러가 날 일이 없습니다. 어떤 상황에서라도 start_game의 입장에서 character_setting 파일의 상대적인 위치는 똑같기 때문입니다.

이런 이유 때문에 프로그램의 소스 코드 내에서 경로를 표시할 때는 상대 경로로 표기하는 것이 좋습니다. 그래야 프로그램이 완성되고 나서 다른 환경으로 옮겨졌을 때에도 문제 없이 실행이 가능하기 때문입니다. 다시 말해, 호환성이 좋아지는 것이죠. 프로그램의 호환성을 결정 짓는 요소는 다양하지만 그 중 한 가지가 바로 경로를 상대 경로로 표기하는 것입니다.

📁 절대 경로와 상대 경로 연습

앞서 배운 내용을 연습해 보겠습니다. 먼저, 현재 위치를 알아볼까요?

/home/tataki26 # pwd 결과

다음으로 절대 경로를 통해 tataki26 폴더 안에 있는 Pictures로 이동해보겠습니다.

cd /home/tataki26/Pictures
/home/tataki26/Pictures # pwd 결과

다시 홈 디렉토리로 돌아가 보겠습니다.

cd /home/tataki26
/home/tataki26 # pwd 결과

이번에는 상대 경로를 통해 Pictures로 이동해보겠습니다.

cd ./Pictures
/home/tataki26/Pictures # pwd 결과

자, 이 상태에서 부모 디렉토리로 이동하려면 어떻게 해야 됐죠? ..을 활용하면 됩니다.

cd ..
~ $ # pwd 결과

이런 식으로 현재 디렉토리 근처의 디렉토리로 이동하거나 근처 디렉토리의 파일을 사용할 때는 상대 경로가 훨씬 편합니다.

이번에는 상대 경로를 이용해서 Documents 폴더로 이동해볼 건데요.

cd ./Documents
/home/tataki26/Documents # pwd 결과

지금부터가 중요합니다. 이 상태에서 아까 이동했던 Pictures로 이동하려면 어떻게 해야 할까요? 네, 맞습니다. ..을 통해 부모 디렉토리로 돌아가서 Pictures로 이동하면 됩니다.

cd ../Pictures
/home/tataki26/Pictures # pwd 결과

참고로 절대 경로로는 이렇습니다.

cd /home/tataki26/Pictures

현재 위치랑 상관 없이 쓸 수 있는 절대 경로와는 달리, 상대 경로의 경우 현재 위치에 맞게 경로를 계속해서 수정해줘야 하는 번거로움이 있습니다. 그러나 부모 디렉토리로 이동하고 싶을 때는 상대 경로가 훨씬 편합니다.

cd ..

간단한 입력만으로 이동이 가능하니까요. 참고로 자식 디렉토리로 이동할 때에는 굳이 맨 앞에 ./을 붙여주지 않아도 됩니다. 즉, cd ./Documents가 아닌 cd Documents만으로도 이동이 잘 됩니다.

📁 cd 커맨드 팁

홈 디렉토리에서 루트 디렉토리로 이동하려면 슬래쉬(/) 하나면 됩니다.

cd /

다시 홈 디렉토리로 이동해보겠습니다. 이때, 경로를 입력해도 되지만 앞서 배웠던 ~를 통해 이동할 수 있습니다. ~가 홈 디렉토리를 의미하니까요.

cd ~

직전 경로로 이동하려면 -을 입력하면 됩니다.

cd -

홈 디렉토리로 오기 전 루트 디렉토리에 있었으니 결과는 루트 디렉토리가 됩니다.


이번 시간에는 CLI 환경에서 디렉토리와 관련하여 현재 위치를 찾아주는 pwd 커맨드, 디렉토리를 이동하는 cd 커맨드와 더불어 절대 경로와 상대 경로 개념에 대해 알아봤습니다. 상대 경로를 이용하면 현재 위치를 기준으로 이동을 하기 때문에 헷갈릴 수 있으니 관련 인자를 잘 숙지하시길 바랍니다.

다음 시간에는 디렉토리 내부를 살펴보고 파일을 다뤄보겠습니다.

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

0개의 댓글