본문 바로가기
리눅스/Part 1 - Learning The Shell

리눅스 기초 | 4-2. 파일과 디렉토리 조작하기

by 객잔주인 2024. 5. 21.

 

해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다


플레이 그라운드 만들기

실제 파일 조작을 해볼 것이기 때문에 안전하게 "놀기"위해 특별한 장소를 만들어보겠습니다. 먼저 우리가 작업할 디렉토리를 만들어야 합니다. playground라는 이름의 디렉토리를 우리의 홈 디렉토리에 생성하겠습니다.

디렉토리 생성하기

디렉토리를 만들기 위해 `mkdir` 명령어를 사용합니다. 우리의 놀이터를 만들기 위해 홈 디렉토리에서 새로운 디렉토리를 만들겠습니다.

 

우리의 놀이터를 더 흥미롭게 만들기 위해 playground 디렉토리 안에 dir1과 dir2라는 하위 디렉토리를 생성하겠습니다. 이를 하기 위해 현재 작업 디렉토리를 playground로 바꾼 후 `mkdir` 명령어를 사용합니다.

 

`mkdir` 명령어는 여러개의 아규먼트를 받아 두 디렉토리를 한 번에 생성할 수 있습니다.

파일 복사

다음으로 playground에 데이터를 받아보겠습니다. 이를 위해 파일을 복사하겠습니다. `cp` 명령어를 사용해서 /etc 디렉토리에 있는 passwd 파일을 현재 작업 디렉토리로 복사하겠습니다.

 

여기서 현재 작업 디렉토리를 표현하기 위해 한 개의 마침표를 사용했습니다. 이제 여기서 `ls`를 사용하면 복사한 파일을 볼 수 있습니다.

 

이제 "-v" 옵션을 이용해서 다시 한 번 복사를 해보고 어떤 일이 일어나는지 보겠습니다.

 

`cp` 명령어는 다시 한 번 복사를 수행했는데 이번에는 어떤 일이 수행되었는지 간략하게 메시지로 표시되었습니다. 여기서 `cp` 명령어가 기존의 파일에 경고 없이 덮어쓰기 했다는 것을 확인할 수 있습니다. 경고를 받기 위해 "-i" 옵션을 사용할 수 있습니다.

 

출력된 프롬프트에 y를 입력하면 덮어쓰기가 진행됩니다. y 이외의 문자가 들어가면 복사가 진행되지 않고 취소됩니다.

파일 옮기기 및 파일명 변경하기

파일명 passwd가 놀이터에 적합하지 않은 것 같습니다. 이름을 바꾸어보죠

 

이제 fun 파일을 각 디렉토리에 옮겨보면서 가지고 놀아보겠습니다. 다음 명령은 파일을 dir1으로 이동시킵니다:

 

다음 명령은 dir1에 있는 fun 파일을 dir2로 옮깁니다.

 

이제 다시 dir2에서 현재 작업 디렉토리로 복귀 시키겠습니다.

 

다음으로는 `mv`를 디렉토리를 대상으로 사용해보겠습니다. 다시 한 번 fun 파일을 dir1으로 옮겨보겠습니다.

 

다음, dir1을 dir2로 옮긴 후 `ls` 명령어로 확인해보겠습니다.

 

dir2가 이미 존재하기 때문에 `mv`가 dir1가 dir2의 하위 디렉토리가 된 것을 볼 수 있습니다. dir2가 존재하지 않았다면 `mv` 명령어는 dir1을 dir2라는 이름으로 바꿨을 것입니다. 마지막으로 모든것을 되돌려보겠습니다.

하드 링크 생성하기

이제 링크를 만들어보겠습니다. 먼저 다음과 같이 데이터 파일에 대해 하드 링크를 만들어보겠습니다.

 

이제 fun 파일에 대한 객체 네 개를 가지게 되었습니다. playground 디렉토리를 살펴보죠.

 

우리가 확인할 수 있는 한 가지는 fun과 fun-hard의 두 번째 필드에 4라고 적혀 있는 하드 링크의 개수를 확인할 수 있습니다. 모든 파일은 링크에 의해 파일명이 생성되기 때문에 적어도 한 개의 링크를 가지고 있다는 것을 기억하세요. 그렇다면 fun과 fun-hard가 같은 파일이라는 것은 어떻게 확인할 수 있을까요? 이 경우에 `ls`는 별로 도움이 되지 않습니다. 다섯번째 필드에서 두 파일의 크기가 같다는 것을 확인할 수는 있지만 확실하게 같은 파일인지는 표시하지 않습니다. 이 문제를 해결하기 위해 조금 더 파고 들어보겠습니다.

 

하드 링크에 대해 생각할 때 파일이 두 개의 파트로 이루어져 있다고 생각하면 도움이 됩니다:

  1. 파일의 정보를 담고있는 데이터 파트
  2. 파일의 이름을 담고있는 이름 파트

우리가 하드 링크를 만들 때, 사실은 같은 데이터 파트를 가리키는 추가적인 이름 파트를 생성하는 것입니다. 시스템은 디스크 블록 체인을 아이노드(inode)에 할당하고 아이노드는 이름 부분이 부여됩니다. 그러므로 각 하드 링크는 파일의 내용을 담고있는 아이노드를 참조합니다. (즉, fun과 fun-hard는 하나의 아이노드를 가리키고 아이노드는 실제 데이터를 가리킵니다)

 

`ls` 명령어에서 이 정보를 볼 수 있는 방법이 있습니다. -i 옵션을 사용하면 됩니다.

 

위 리스트에서 첫 번째 필드가 아이노드 번호를 보여줍니다. 보시다시피 fun과 fun-hard는 같은 아이노드 번호를 공유하고, 이는 같은 파일이라는 것을 확인시켜줍니다.

심볼릭 링크 생성하기

심볼릭 링크는 하드 링크가 가진 두 가지 한계를 극복하기 위해 만들어졌습니다.

  1. 하드 링크는 동일한 파일 시스템 내에서만 생성됩니다
  2. 하드 링크는 디렉토리를 참조할 수 없습니다. 오직 파일만 참조할 수 있습니다.

심볼릭 링크는 목적 파일이나 디렉토리를 가리키는 텍스트 포인터를 가지는 특수한 타입의 파일입니다.

 

심볼릭 링크를 생성하는 것은 하드 링크와 비슷합니다.

 

첫 번째 예제는 직관적으로 알아들을 수 있습니다. 하드 링크를 만드는 명령어에 "-s" 옵션을 추가해 심볼릭 링크를 만들었습니다. 하지만 나머지 두 개는 어떤가요? 우리가 심볼릭 링크를 만드는 것은 심볼릭 링크에서 타겟이 되는 파일의 상대적 위치를 담은 텍스트 설명서를 만드는 것입니다. `ls`의 출력을 보면 알아보기 쉽습니다:

 

dir1 내의 fun-sym 항목을 보면 첫 번째 필드의 맨 앞 글자가 "l"로 되어있어 심볼릭 링크라는 것을 알 수 있고, ../fun을 올바르게 가리키는 것을 알 수 있습니다. fun-sym의 위치에서 보았을 때 fun은 상위 디렉토리에 있죠. 심볼릭 링크 파일의 길이가 6인 것을 볼 수 있는데 이는 ../fun이 쓰여있기 때문입니다. 심볼릭 링크 파일이 가리키는 파일의 크기가 아니라 심볼릭 링크 파일 자체의 길이인 것을 확인할 수 있죠.

 

심볼릭 링크는 일반 파일 뿐 아니라 디렉토리를 참조할 수 있습니다.

 

파일과 디렉토리 삭제하기

앞에서 배웠듯이 `rm` 명령어는 파일과 디렉토리를 삭제하기 위한 명령어입니다. 우리의 playground를 정리하는 데에 사용해보겠습니다. 먼저, 하드 링크 중 하나를 삭제하겠습니다.

 

우리가 예상한대로 작동됐군요. fun-hard 파일이 사라졌고 fun을 참조하는 링크(두 번째 필드)의 개수가 4에서 3으로 줄었습니다. 다음으로 fun을 삭제하는데 -i 옵션을 같이 넣어보겠습니다.

 

프롬프트에 y를 입력하면 파일이 삭제됩니다. 하지만 이제 `ls` 결과가 어떻게 나오는지 보겠습니다. fun-sym에 어떤 변화가 생겼는지 보이시나요? 심볼릭 링크가 존재하지 않는 파일을 가리키고 있기 때문에 링크는 깨졌습니다.

 

대부분의 리눅스 배포판은 `ls`가 깨진 링크를 표시하도록 설정되어 있습니다. 깨진 링크의 존재가 위험한 것은 아니지만 지저분하죠. 깨진 링크를 사용하려고 하면 다음과 같은 결과를 볼 수 있습니다:

 

살짝 정리를 해보겠습니다. 심볼릭 링크들을 삭제해보죠:

 

심볼릭 링크에 대해 기억해야 할 한 가지는 대부분의 파일 작업이 링크 자체가 아니라 링크가 가리키는 목표를 대상으로 실행된다는 것입니다. `rm`은 예외입니다. 링크를 삭제하면 목표를 삭제하는 것이 아닌 링크를 삭제합니다.

 

마지막으로 playground를 삭제하겠습니다. 이를 위해 홈 디렉토리로 돌아간 후 `rm`에 -r 옵션을 주어 playground와 그 내용을 전부 삭제할 것입니다.

GUI를 이용하여 심볼릭 링크 만들기

GNOME과 KDE의 파일 매니저는 공통적으로 심볼릭 링크를 생성하는 쉽고 자동화된 방법을 제공합니다. GNOME에서는 Ctrl+Shift를 누른 상태에서 파일을 드래그하면 링크를 생성합니다. KDE에서는 파일을 드랍할 때마다 복사, 이동, 링크 생성 중 하나를 고를 수 있습니다.

 

요약

이번 장에서 많은 것을 살펴보았습니다. 배운 것들을 완전히 체득하기 위해서는 시간이 걸릴 것입니다. Playground 실습을 이해가 갈 때까지 계속 반복하세요. 기본적인 파일 조작 명령어와 와일드카드에 익숙해지는 것은 매우 중요합니다. playground 실습을 확장하여 더 많은 파일과 디렉토리를 추가하고 와일드카드를 사용해 다양한 작업을 해보세요. 링크에 관한 개념은 처음엔 다소 혼란스럽게 느껴질 수 있습니다. 시간을 들여 이들이 어떻게 작동하는지 익혀보세요. 언젠가 여러분을 구원해줄 것입니다.

 

추가 자료

 

Symbolic link - Wikipedia

From Wikipedia, the free encyclopedia Any file that contains a reference to another file or directory In computing, a symbolic link (also symlink or soft link) is a file whose purpose is to point to a file or directory (called the "target") by specifying a

en.wikipedia.org