해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다
이제 진짜로 뭔가를 해봅시다! 이번 챕터에서는 다음과 같은 명령어들에 대해 배워보겠습니다.
- `cp` - 파일과 디렉토리를 복사합니다
- `mv` - 파일과 디렉토리를 옮기거나 이름을 변경합니다
- `mkdir` - 디렉토리를 생성합니다
- `rm` - 파일과 디렉토리를 삭제합니다
- `ln` - 하드 링크와 심볼릭 링크를 생성합니다
이들 다섯 개 명령어는 리눅스에서 가장 많이 쓰이는 것들 중 하나입니다. 파일이나 디렉토리를 조작하기 위한 명령어들이죠
사실 그래픽 기반 파일 매니저를 사용하면 이 명령어들을 사용하는 것 보다 쉽게 조작이 가능한 부분도 있습니다. 파일 매니저를 사용하면 드래그 & 드랍으로 파일을 다른 디렉토리로 옮길 수 있고, 잘라내기 & 붙여넣기가 가능한 등 여러 부분에서 편의성이 더 좋습니다. 그렇다면 왜 커맨드 라인 프로그램을 사용하는 걸까요?
답은 그 능력과 유연성에 있습니다. 그래픽 기반 파일 매니저로 간단한 파일 조작을 쉽게 할 수 있지만 복잡한 작업은 커맨드 라인 프로그램으로 처리하는 것이 더 쉬울 수 있습니다. 예를 들어, 모든 HTML 파일을 한 디렉토리에서 다른 디렉토리로 복사하고자 할 때, 목적지가 되는 디렉토리에 없거나 업데이트 된 HTML 파일 만 옮기고자 할 때에는 어떻게 해야할까요? 파일 매니저로는 꽤 어렵겠지만 커맨드 라인으로는 쉬운 작업입니다.
와일드카드(Wildcards)
명령어를 사용하기 전에 이 명령어들을 강력하게 만들어주는 쉘 기능에 대해 알아야 합니다. 쉘이 파일명을 자주 사용하기 때문에 파일명의 그룹을 빠르게 특정하도록 도와주는 특수문자들이 있습니다. 이 특수문자들을 와일드카드(wildcards)라고 합니다. 와일드카드를 사용하는 것(이를 줄여서 글로빙, globbing이라고 합니다)은 문자 패턴을 기반으로 파일명을 선택할 수 있도록 해줍니다. Table 4-1 와일드카드 목록과 각 와일드카드의 의미를 보여줍니다.
Table 4-1: 와일드카드
와일드카드 | 의미 | 예시 |
* | 모든 문자열과 매칭 | a*는 'a', 'apple', 'arm', 'aabbccdd' 등과 매칭됨 |
? | 모든 단일 문자와 매칭 | a?는 'at', 'ap', 'a_' 등과 매칭됨 |
[characters] | 대괄호 내에 있는 문자들중 하나와 같은 단일 문자와 매칭 | [aeiou]는 임의의 모음 문자와 매칭됨 |
[!characters] | 대괄호 내에 있는 문자들이 아닌 단일 문자와 매칭 | [!aeiou]는 모음이 아닌 문자와 매칭됨 |
[[:class:]] | 특정 클래스에 해당하는 모든 문자열과 매칭 | [:digit:]은 모든 숫자와 매칭됨 |
Table 4-2는 많이 사용되는 문자열 클래스 목록입니다.
Table 4-2: 자주 사용되는 문자열 클래스
문자열 클래스 | 의미 |
[:alnum:] | 모든 대소문자 알파벳, 숫자와 매칭됨 |
[:alpha:] | 모든 대소문자 알파벳과 매칭됨 |
[:digit:] | 모든 숫자와 매칭됨 |
[:lower:] | 모든 소문자 알파벳과 매칭됨 |
[:upper:] | 모든 대문자 알파벳과 매칭됨 |
와일드카드를 사용하면 복잡한 파일명 필터를 만들 수 있습니다. Table 4-3은 와일드카드의 실사용 예시를 보여줍니다.
Table 4-3: 와일드카드 사용 예시
패턴 | 매치되는 파일명 |
* | 모든 파일 |
g* | "g"로 시작하는 모든 파일 |
b*.txt | "b"로 시작하고 ".txt"로 끝나는 모든 파일 |
Data??? | "Data"로 시작하고 뒤에 세 문자가 오는 모든 파일 |
[abc]* | "a", "b" 혹은 "c"로 시작하는 모든 파일 |
BACKUP.[0-9][0-9][0-9] | "BACKUP."으로 시작해 뒤에 세 자리 숫자로 끝나는 모든 파일 |
[[:upper:]]* | 대문자 알파벳으로 시작하는 모든 파일 |
[![:digit:]]* | 숫자가 아닌 문자로 시작하는 모든 파일 |
*[[:lower:]123] | 소문자 알파벳이나 숫자 "1", "2" 또는 "3"으로 끝나는 모든 파일 |
와일드카드는 파일명을 입력받는 모든 명령어와 함께 사용할 수 있습니다. 이에 관한 내용은 챕터 7에서 자세히 살펴보겠습니다.
Character Ranges
다른 유닉스 계열 환경을 사용하다가 오셨다거나 이에 관한 다른 책을 보신 적이 있다면 [A-Z]나 [a-z]와 같은 문자열 범위 표기법을 본 적이 있을겁니다. 이는 전통적인 유닉스의 표기법으로 옛날 버전 리눅스에서도 사용됩니다. 지금도 사용할 수는 있지만 로케일 설정이나 문자 인코딩 방식에 따라 의도치 않은 결과를 낳을 수 있습니다. 그러니 지금은 일단 [:class:]를 사용하도록 합시다.
Wildcards Work in the GUI Too
와일드카드는 커맨드 라인에서 자주 사용될 뿐 아니라 몇 몇의 그래픽 파일 매니저에서도 지원됩니다.
- 노틸러스(GNOME의 파일 매니저)에서는 '패턴 편집/선택'을 이용해 파일을 선택할 수 있습니다. 와일드카드를 이용해 파일 선택 패턴을 입력하면 현재 보고있는 디렉토리에서 패턴과 매칭되는 파일들이 하이라이트 됩니다.
- 돌핀이나 컨커러(KDE의 파일 매니저)의 몇몇 버전에서는 와일드카드를 location bar에 직접 입력할 수 있습니다. 예를 들어, /usr/bin 디렉토리에서 소문자 "u"로 시작하는 모든 파일을 보고 싶다면, location bar에 "/usr/bin/u*"를 입력하면 의도한 결과를 볼 수 있습니다.
커맨드 라인 인터페이스에서 시작된 기능들이 그래픽 인터페이스에서도 사용 가능한 경우가 많습니다. 이는 리눅스 데스크탑이 강력한 이유들 중 하나죠.
`mkdir` - 디렉토리 생성
`mkdir` 명령어는 디렉토리를 생성할 때 사용됩니다. 이는 다음과 같이 작동합니다:
표기법에 대한 노트: 위와 같이 커맨드의 아규먼트 뒤에 세 개의 마침표가 붙어있는 것은 아규먼트가 반복될 수 있다는 의미입니다. 따라서 다음과 같이 여러 개의 디렉토리명을 입력하면 여러 개의 디렉토리를 명령어 한 번으로 생성할 수 있습니다:
`cp` - 파일과 디렉토리 복사
`cp` 명령어는 파일이나 디렉토리를 복사합니다. 두 가지 다른 방식으로 사용될 수 있는데, 첫 번째 방식은 아래와 같이 파일이나 디렉토리인 item1을 item2로 복사하거나:
또는 여러개의 item을 디렉토리에 복사합니다:
유용한 옵션 및 사용 예시
Table 4-4는 자주 사용되는 `cp`의 옵션들 입니다.
Table 4-4: `cp`의 옵션
옵션 | 롱 옵션 | 의미 |
-a | --archive | 소유자, 권한과 같은 모든 속성을 포함해서 파일과 디렉토리를 복사합니다. -a 옵션을 사용하지 않을 경우 복사를 하는 유저의 기본 속성을 가집니다. 파일 권한에 대해서는 챕터9에서 더 자세히 살펴보겠습니다. |
-i | --interactive | 파일을 덮어쓰기 전에 유저에게 확인받기 위한 프롬프트를 띄웁니다. 이 옵션이 없으면 경고 없이 파일이 덮어쓰기 됩니다. |
-r | --recursive | 재귀적으로 디렉토리와 그 내용을 복사합니다. 디렉토리를 복사할 때에는 이 옵션이나 -a 옵션이 필요합니다. |
-u | --update | 파일을 다른 디렉토리로 복사할 때 해당 파일이 없거나 새로 업데이트된 파일만 복사합니다. 대량의 파일을 복사할 때 복사할 필요가 없는 파일을 스킵함으로써 시간을 아낄 수 있어 유용합니다. |
-v | --verbose | 복사가 진행될 때 자세한 메시지를 표시합니다. |
Table 4-5: `cp`의 사용 예시
명령어 | 결과 |
cp file1 file2 | file1을 file2로 복사합니다. file2가 존재하는 경우 file1의 내용으로 덮어쓰기 됩니다. file2가 존재하지 않는 경우 새로 생성됩니다. |
cp -i file1 file2 | 바로 위 명령어와 같지만 file2가 이미 존재하는 경우 덮어쓰기를 진핼 할 지 여부를 묻는 프롬프트가 표시됩니다. |
cp file1 file2 dir1 | file1과 file2를 dir1으로 복사합니다. 이 때 dir1이 이미 만들어져 있어야 합니다. |
cp dir1/* dir2 | 와일드카드를 이용해 dir1의 모든 파일을 dir2로 복사합니다. 마찬가지로 dir2가 이미 생성되어 있어야 합니다. |
cp -r dir1 dir2 | dir1의 모든 내용을 dir2로 복사합니다. dir2가 존재하지 않는 경우 새로 생성되고, 복사가 진행된 후 dir1과 같은 내용을 갖게 됩니다. dir2가 이미 존재하는 경우 dir1이 통째로 dir2 내부에 복사됩니다. |
`mv` - 파일 이동 및 이름 변경
`mv` 명령어는 사용 방법에 따라 파일 이동과 파일명 변경을 모두 수행할 수 있습니다. 어느 경우든 기존의 파일명은 더 이상 존재하지 않게 됩니다. `mv`는 `cp`와 사용방법이 매우 비슷합니다:
item1이란 파일 혹은 디렉토리를 item2로 옮기거나 이름을 변경합니다:
혹은 여러개의 아이템을 한 디렉토리로 이동시킵니다:
유용한 옵션 및 사용 예시
Table 4-6에서와 같이 `mv`는 `cp`와 많은 옵션을 공유합니다.
Table 4-6: `mv`의 옵션
옵션 | 롱 옵션 | 의미 |
-i | --interactive | 기존 파일을 덮어쓰기 할 때 확인하는 프롬프트를 출력합니다. 이 옵션이 없는 경우 경고 없이 모두 덮어쓰기 됩니다. |
-u | --update | 파일을 다른 디렉토리로 복사할 때 해당 파일이 없거나 새로 업데이트된 파일만 복사합니다. |
-v | --verbose | 복사가 진행될 때 자세한 메시지를 표시합니다. |
Table 4-7은 `mv`의 사용 예시를 보여줍니다.
Table 4-7: `mv`의 사용 예시
명령어 | 결과 |
mv file1 file2 | file1을 file2로 이동 시킵니다. file2가 존재하는 경우 file1의 내용으로 덮어쓰기 됩니다. file2가 존재하지 않는 경우 새로 생성됩니다. 어느 경우든 file1은 사라집니다. |
mv -i file1 file2 | 바로 위 명령어와 같지만 file2가 이미 존재하는 경우 덮어쓰기를 진핼 할 지 여부를 묻는 프롬프트가 표시됩니다. |
mv file1 file2 dir1 | file1과 file2를 dir1으로 이동 시킵니다. 이 때 dir1이 이미 만들어져 있어야 합니다. |
mv dir1 dir2 | dir2가 존재하지 않으면, dir2를 생성하고 dir1의 내용을 dir2에 옮긴 후 dir1을 삭제합니다. dir2가 존재하면, dir1을 dir2의 내부로 이동시킵니다. |
`rm` - 파일 및 디렉토리 삭제
`rm` 명령어는 파일이나 디렉토리를 삭제하는데에 쓰이고 다음과 같이 사용됩니다:
여기서 item은 1개 이상의 파일이나 디렉토리입니다.
유용한 옵션 및 사용 예시
Table 4-8은 자주 사용되는 `rm`의 옵션을 보여줍니다.
Table 4-8: `rm`의 옵션
옵션 | 롱 옵션 | 의미 |
-i | --interactive | 기존 파일을 제거하기 전 확인을 위한 프롬프트를 출력합니다. 이 옵션이 없으면 경고 없이 파일을 삭제합니다. |
-r | --recursiv | 재귀적으로 디렉토리를 삭제합니다. 즉, 디렉토리가 하위 디렉토리를 가진경우 그 디렉토리도 같이 삭제합니다. 디렉토리를 삭제할 때에는 이 옵션이 붙어야 합니다. |
-f | --force | 존재하지 않는 파일을 무시하고 프롬프트를 출력하지 않습니다. --interactive 옵션을 무시합니다. |
-v | --verbose | 삭제가 진행될 때 자세한 메시지를 표시합니다. |
Table 4-9에서는 `rm`의 사용 예시를 볼 수 있습니다
Table 4-9: `rm`의 사용 예시
명령어 | 결과 |
rm file1 | file1을 삭제합니다. |
rm -i file1 | file1을 삭제하기 전에 확인을 위한 프롬프트를 출력합니다. |
rm -r file1 dir1 | file1과 dir1과 그 내용을 모두 삭제합니다. |
rm -rf file1 dir1 | file1이나 dir1이 존재하지 않더라도 삭제 프로세스를 진행합니다. |
`rm` 사용에 주의하세요!
리눅스 같은 유닉스 계열 운영체제는 삭제를 되돌리는 명령어가 없습니다. `rm`으로 파일이나 디렉토리를 삭제하면 그것은 완전히 사라집니다. 리눅스는 당신이 똑똑하고 자신이 하는 행동의 의미를 이해하고 있다고 가정합니다.
와일드카드 사용에 특별히 주의하세요. 이 전형적인 예시를 염두에 두세요. 여러분이 디렉토리 내에있는 모든 HTML 파일을 삭제하고 싶다고 가정해봅시다. 이를위해서 당신은 다음과 같은 명령어를 입력합니다:
`rm *.html`
이는 맞는 명령입니다. 그런데 실수로 다음과 같이 `*`와 `.html`사이에 스페이스가 하나 들어갔다면:
`rm * .html`
`rm` 명령어는 디렉토리 내의 모든 파일을 삭제한 뒤 .html이라는 파일이 없다는 메시지를 띄울 것입니다.
유용한 팁: `rm`과 함께 와일드카드를 사용할 때마다 (타이핑에 유의하는 것 외에도) `ls` 명령어를 이용해 와일드카드를 테스트해보세요. 이렇게 하면 어떤 파일들이 삭제될 지 사전에 확인할 수 있습니다. 그 후에 위쪽 화살표를 눌러 `ls`를 `rm`으로 바꾸어주면 파일들을 삭제할 수 있습니다.
`ln` - 링크 생성
`ln` 명령어는 하드 링크나 심볼릭 링크를 생성하는 데에 사용됩니다. 이 역시 두 가지 방식으로 사용될 수 있습니다. 하드 링크를 만들 때는 다음과 같이 입력하고:
심볼릭 링크를 만들 때는 다음과 같이 입력합니다(여기서 item은 파일이나 디렉토리 모두 가능합니다):
하드 링크
하드 링크는 유닉스가 링크를 생성하는 고전적인 방법인 반면, 심볼릭 링크는 더 모던한 방식입니다. 기본적으로 모든 파일은 파일에 이름을 부여하는 하드 링크를 하나 가지고 있습니다. 하드링크를 만들 때 우리는 파일에 대한 새로운 디렉토리 엔트리(directory entry)를 생성하는 것입니다. 하드 링크는 다음과 같은 두 가지 중요한 한계를 가지고 있습니다:
- 하드 링크는 파일 시스템 바깥의 파일을 참조할 수 없습니다. 다시 말해서 링크와 같은 디스크 파티션내에 있지 않은 파일을 참조할 수 없다는 것을 의미합니다.
- 하드 링크는 디렉토리를 참조할 수 없습니다.
하드 링크는 파일 자체와 구별할 수 없습니다. 심볼릭 링크와는 다르게 하드 링크가 있는 디렉토리의 목록을 출력할 때 링크라는 표시를 확인할 수 없을 것입니다. 하드 링크가 삭제될 때 링크는 삭제되지만 파일 자체는 삭제되지 않고, 모든 링크가 삭제 되기 전까지 파일은 계속 남아있습니다.
하드 링크를 때때로 만날 일이 있으므로 이를 알고있는 것은 중요합니다. 그러나 요즘은 심볼릭 링크를 더 선호합니다.
심볼릭 링크
심볼릭 링크는 하드 링크의 한계를 극복하기 위해 만들어졌습니다. 심볼링 링크는 참조 파일이나 디렉토리를 가리키는 텍스트 포인터를 담고있는 특수한 형태의 파일입니다. 즉, Windows의 바로가기와 유사하게 작동됩니다. 물론 그보다 한참 전에 만들어졌지만요.
심볼릭 링크가 가리키는 파일과 그 심볼릭 링크 자체는 크게 봤을 때 서로 구별하기가 어렵습니다. 예를 들어, 우리가 심볼릭 링크에 무언가를 작성 했다면 참조 파일에도 같은 내용이 작성됩니다. 그러나 심볼릭 링크를 삭제할 때에는 링크만 삭제되고 파일은 남아있습니다. 파일이 심볼릭 링크보다 먼저 삭제되면, 링크는 남아있지만 아무것도 가리키지 않게 됩니다. 이 경우, 링크가 깨졌다(broken)고 표현합니다. 많은 경우에 `ls` 명령은 빨간색 처럼 구분되는 색으로 깨진 링크를 표시합니다.
링크에 대한 개념이 혼란스러울 수 있습니다. 하지만 일단은 그 상태로 계십시오. 여기에 대해 더 설명할 예정이니까 나중에는, 바라건데, 명확히 이해가 될 것입니다.
'리눅스 > Part 1 - Learning The Shell' 카테고리의 다른 글
리눅스 기초 | 5. 명령어 알아보기 (0) | 2024.05.22 |
---|---|
리눅스 기초 | 4-2. 파일과 디렉토리 조작하기 (0) | 2024.05.21 |
리눅스 기초 | 3. 시스템 살펴보기 (0) | 2024.05.14 |
리눅스 기초 | 2. 탐색 (Navigation) (0) | 2024.05.13 |
리눅스 기초 | 1. 쉘이란? (0) | 2024.05.11 |