경로
1. 개요
경로는 파일 시스템에서 파일이나 디렉터리의 위치를 나타내는 문자열이다. 1960년대 중반 멀틱스에서 처음으로 디렉터리를 사용하는 계층적 파일 시스템이 도입된 이후, 유닉스, MS-DOS, 윈도우 등 다양한 운영 체제에서 경로 표현 방식이 발전해 왔다. 유닉스 계열은 슬래시(/)를, MS-DOS와 윈도우는 백슬래시(\) 또는 슬래시(/)를 디렉터리 구분자로 사용하며, 절대 경로와 상대 경로의 개념을 가진다. 또한, UNC(범용 명명 규칙)는 네트워크 리소스의 위치를 나타내는 데 사용된다. 프로그래밍 언어에서도 파일 접근 시 경로를 사용하며, 운영 체제에 따라 경로 표현 방식이 다르므로 이식성을 고려하여야 한다.
2. 역사
파일 경로의 역사는 운영체제 발전과 함께한다. 초기에는 파일 디렉터리 개념이 없었으나, 멀틱스와 유닉스가 계층적 파일 시스템을 도입하면서 경로 구분의 필요성이 생겼다. 멀틱스는 '>'를, 유닉스는 '/'를 구분자로 사용했다. MS-DOS는 초기에는 디렉터리를 지원하지 않았고, 명령어에 '/'를 스위치 문자로 사용했다. 이후 디렉터리 지원이 추가되면서 백슬래시('\')를 구분자로 도입했다.
2.1. 초기 시스템
멀틱스는 1960년대 중반에 디렉터리 구분자로 '>'를 사용하여 계층적 파일 시스템을 도입하였다. 1970년경, 유닉스는 슬래시('/')를 디렉터리 구분자로 도입하였다.
2.2. MS-DOS와 윈도우
1981년에 출시된 최초 버전의 MS-DOS는 파일 디렉터리를 지원하지 않았다. MS-DOS 1.0에 포함된 유틸리티 명령들 상당수는 IBM에서 비롯되었으며, 명령어에 슬래시(/)를 스위치 문자로 사용하였다. (예: `dir /w`)
MS-DOS 2.0에서 디렉터리 지원이 추가되었을 때, 하위 호환성을 위해 '/'는 스위치 문자로 유지되었다. 마이크로소프트는 백슬래시('\')를 디렉터리 구분자로 선택했는데, 이는 슬래시와 비슷하게 보인다. 한편, 한국어와 일본어 마이크로소프트 윈도우에서는 백슬래시 대신 ₩나 ¥가 표시되기도 한다.
3. 절대 경로와 상대 경로
절대 경로는 루트 디렉터리부터 시작하여 파일의 전체 위치를 나타낸다. 따라서 현재의 작업 디렉터리에 관계없이 파일 시스템 내의 동일한 위치를 가리킨다.
반대로, 상대 경로는 주어진 작업 디렉터리에서 시작하므로 전체 절대 경로를 제공할 필요가 없다. 파일명은 현재 작업 디렉터리를 기준으로 하는 상대 경로로 간주할 수 있다. 작업 디렉터리가 파일의 상위 디렉터리가 아닌 경우, 파일 이름을 사용하여 파일을 참조하면 파일을 찾을 수 없음 오류가 발생한다.
4. Base URL
API 경로의 일관된 부분으로, 여기에 엔드포인트 경로가 추가된다.
5. 운영 체제별 경로 표현
다음은 다양한 운영체제와 셸에서 사용되는 경로 표현 방식을 정리한 표이다.
| 운영 체제 | 셸 | 루트 디렉터리 | 디렉터리 구분자 | 현재 디렉터리 | 부모 디렉터리 | 홈 디렉터리 | 예 |
|---|---|---|---|---|---|---|---|
| 유닉스 계열 OS | 유닉스 셸 | / | / | . | .. | ~ | /home/user/docs/Letter.txt./inthisdir../../greatgrandparent~/.rcinfo |
| 도스 | COMMAND.COM | [드라이브 문자:]\ 또는 \\[서버 이름]\[볼륨]\ | \ | . | .. | C:\USER\DOCS\LETTER.TXTA:PICTURE.JPG\\SERVER01\USER\DOCS\LETTER.TXT | |
| OS/2 | Cmd.exe | [드라이브 문자:]\ | / 또는 \ | . | .. | C:\user\docs\Letter.txtA:Picture.jpg | |
| 마이크로소프트 윈도우 | Cmd.exe | \ (현재 작업 디렉터리 루트에 상대적)또는 [드라이브_문자]:\또는 \\[서버]\[공유이름]\또는 \\?\[드라이브_사양]:\또는 \\?\[서버]\[공유이름]\또는 \\?\UNC\[서버]\[공유이름]\또는 \\.\[물리_장치]\ | / 또는 \ | . | .. | C:\user\docs\Letter.txt/user/docs/Letter.txtC:Letter.txt\\Server01\user\docs\Letter.txt\\?\UNC\Server01\user\docs\Letter.txt\\?\C:\user\docs\Letter.txtC:\user\docs\somefile.ext:alternate_stream_name ./inthisdir../../greatgrandparent | |
| 마이크로소프트 윈도우 | 윈도우 파워셸 | [드라이브 이름:]/ 또는 [드라이브 이름:]\또는 \\[서버 이름]\ 또는 | / 또는 \ | . | .. | ~ | C:\user\docs\Letter.txt\\Server01\user\docs\Letter.txtcd ~\Desktop |
| TOPS-20 | DCL | [장치 이름:] | . | PS: | |||
| RSX-11 | MCR | [장치 이름:] | DR0:[30,12]LETTER.TXT;4 | ||||
| OpenVMS | DCL | [장치 이름:][000000] 또는 | . | [] | [-] | SYS$LOGIN: | SYS$SYSDEVICE:[USER.DOCS]PHOTO.JPG[]IN_THIS_DIR.COM; |
| 클래식 맥 OS | [볼륨 또는 드라이브 이름]: | : | : | :: | Macintosh HD:Documents:Letter:fileincurrentdir::fileinparent:::fileingrandparent | ||
| ProDOS | AppleSoft BASIC | /[볼륨 또는 드라이브 이름]/ | / | /SCHOOL.DISK/APPLEWORKS/MY.REPORTFLIGHT.SIMULATOR,D2 | |||
| 아미가OS | Amiga CLI / AmigaShell | [드라이브, 볼륨, 장치, 또는 할당 이름]: | / | "" (빈 문자열) | / | Workbench:Utilities/MultiViewDF0:S/Startup-SequenceS:Startup-SequenceTCP:en.wikipedia.com/80 | |
| RISC OS | ShellCLI | [fs 유형[#옵션]:][:드라이브 문자 또는 디스크 이름.]$&, % @을 사용하여 현재 사용자, 라이브러리, 현재 (작업) 디렉터리의 루트를 각각 참조할 수 있다. | . | @ | ^ | & | ADFS::MyDrive.$.Documents.LetterNet#MainServer::DataDrive.$.Main.sy10823LanMan::WindowsC.$.Pictures.Japan/gifNFS:&.!ChoicesADFS:%.IfThere@.inthisdir^.^.greatgrandparent파일 확장자가 포함된 파일 시스템들이 마운트되면 '.' 문자는 '/'로 변경된다. |
| 심비안 OS | File manager | \ | \user\docs\Letter.txt | ||||
| 도메인/OS | Shell | // (도메인의 루트)/ (현재 노드의 루트) | / | . | \ | ~ | //node/home/user/docs/Letter.txt./inthisdir\\greatgrandparent~rcinfo |
| 미뉴엣OS | CMD | / | |||||
| Stratus VOS | VOS command-line interpreter | %[시스템_이름]#[모듈_이름]> | > | < | %sysname#module1>SubDir>AnotherDir | ||
| 논스톱 커널 | TACL Tandem Advanced Command Language | 루트 없음 | . | 부모 디렉터리 없음 | \NODE.$DISK.SUBVOL.FILE\NODE.$DEVICE\NODE.$DEVICE.#SUBDEV.QUALIFIER | ||
| CP/M | CCP | [드라이브 문자:] | 하위 디렉터리 없음 | 하위 디렉터리 없음 | 부모 없음 | 하위 디렉터리 없음 | A:LETTER.TXT |
| GS/OS | :[볼륨 이름]: 또는 .[장치 이름]: 또는 [두문자]:참고: 두문자는 숫자(0-31), * (부트 볼륨) 또는 @ (AppleShare 홈 디렉터리)가 올 수 있다. | : 또는 / | @ | :Apps:Platinum.Paint:Platinum.Paint*:System:Finder.APPLEDISK3.5B/file | |||
| OpenHarmony (incl. HarmonyOS) | exec | hb set -root [ROOT_PATH]hb set -p --product [PRODUCT_NAME] | > | ./ | ../ | LOCAL>MEDIA_TYPE_>Download>Letter.txt |
한국어와 일본어 버전의 마이크로소프트 윈도우는 원래의 디렉터리 구분자 대신 ₩ 문자와 ¥ 문자를 표시할 수 있다. 이는 MS-DOS 초기 버전에서 7비트 ASCII만 지원하는 프로그램과의 호환성을 위해 백슬래시를 이러한 문자로 대체했기 때문이다.
5.1. 유닉스 계열
유닉스 셸을 사용하는 유닉스 계열 운영 체제에서 루트 디렉터리는 `/`로 표시되며, 디렉터리 구분자 또한 `/`이다. 현재 디렉터리는 `.`으로, 부모 디렉터리는 `..`으로, 홈 디렉터리는 `~`로 나타낸다. 예를 들어, `/home/user/docs/Letter.txt`는 `/home` 디렉터리 아래의 `user` 디렉터리 안에 있는 `docs` 디렉터리에 `Letter.txt` 파일이 있음을 의미한다.
| 루트 디렉터리 | 디렉터리 구분자 | 현재 디렉터리 | 부모 디렉터리 | 홈 디렉터리 | 예시 |
|---|---|---|---|---|---|
/ | / | . | .. | ~ |
5.2. 도스, OS/2, 윈도우
도스, OS/2, 마이크로소프트 윈도우 운영 체제에서 경로를 나타내는 방식은 다음과 같다.
| 운영 체제 | 셸 | 루트 디렉터리 | 디렉터리 구분자 | 예시 |
|---|---|---|---|---|
| 도스 | COMMAND.COM | [드라이브 문자:]\ 또는 \\[서버 이름]\[볼륨]\ | \ | C:\USER\DOCS\LETTER.TXTA:PICTURE.JPG\\SERVER01\USER\DOCS\LETTER.TXT |
| OS/2 | Cmd.exe | [드라이브 문자:]\ | / 또는 \ | C:\user\docs\Letter.txtA:Picture.jpg |
| 마이크로소프트 윈도우 | Cmd.exe | \ (현재 작업 디렉터리 루트에 상대적)또는 [드라이브_문자]:\또는 \\[서버]\[공유이름]\또는 \\?\[드라이브_사양]:\또는 \\?\[서버]\[공유이름]\또는 \\?\UNC\[서버]\[공유이름]\또는 \\.\[물리_장치]\ | / 또는 \ | C:\user\docs\Letter.txt/user/docs/Letter.txtC:Letter.txt\\Server01\user\docs\Letter.txt\\?\UNC\Server01\user\docs\Letter.txt\\?\C:\user\docs\Letter.txtC:\user\docs\somefile.ext:alternate_stream_name ./inthisdir../../greatgrandparent |
| 윈도우 파워셸 | [드라이브 이름:]/ 또는 [드라이브 이름:]\또는 \\[서버 이름]\ 또는 | / 또는 \ | C:\user\docs\Letter.txt\\Server01\user\docs\Letter.txtcd ~\Desktop |
* 루트 디렉터리:
* 도스: `드라이브 문자:\` (예: `C:\`) 또는 `\\서버 이름\볼륨\` (예: `\\SERVER01\USER\`)
* OS/2, 윈도우 (Cmd.exe): `드라이브 문자:\` (예: `C:\`)
* 윈도우 (파워셸): `드라이브 이름:\` 또는 `드라이브 이름:/` (예: `C:\` 또는 `C:/`), `\\서버 이름\` (예: `\\Server01\`)
* 디렉터리 구분자:
* 도스: `\`
* OS/2, 윈도우: `/` 또는 `\`
* 특이 사항: 한국어와 일본어 버전의 윈도우에서는 디렉터리 구분자로 `\` 대신 ₩ 또는 ¥ 문자를 표시하기도 한다. 이는 초기 MS-DOS 버전에서 7비트 ASCII만 지원하는 프로그램과의 호환성을 위해 백슬래시를 해당 문자로 대체했기 때문이다.
5.3. 기타 운영체제
| 운영 체제 | 루트 디렉터리 | 디렉터리 구분자 | 현재 디렉터리 | 부모 디렉터리 | 홈 디렉터리 | 예 |
|---|---|---|---|---|---|---|
| 클래식 맥 OS | [볼륨 또는 드라이브 이름]: | : | : | :: | Macintosh HD:Documents:Letter:fileincurrentdir::fileinparent:::fileingrandparent | |
| 아미가OS | [드라이브, 볼륨, 장치, 또는 할당 이름]: | / | "" (빈 문자열) | / | Workbench:Utilities/MultiViewDF0:S/Startup-SequenceS:Startup-SequenceTCP:en.wikipedia.com/80 | |
| RISC OS | [fs 유형[#옵션]:][:드라이브 문자 또는 디스크 이름.]$&, % @을 사용하여 현재 사용자, 라이브러리, 현재 (작업) 디렉터리의 루트를 각각 참조할 수 있다. | . | @ | ^ | & | ADFS::MyDrive.$.Documents.LetterNet#MainServer::DataDrive.$.Main.sy10823LanMan::WindowsC.$.Pictures.Japan/gifNFS:&.!ChoicesADFS:%.IfThere@.inthisdir^.^.greatgrandparent파일 확장자가 포함된 파일 시스템들이 마운트되면 '.' 문자는 '/'로 변경된다. |
6. 프로그래밍 언어에서의 경로
프로그래밍 언어에서도 파일을 열 때와 같이 경로를 사용한다. 대부분의 프로그래밍 언어는 기본 운영 체제의 경로 표현을 따른다.
```c
uxFile = fopen("project/readme.txt", "r")
```
```c
winFile = fopen("C:\\Program Files\\bin\\config.bat", "r")
```
운영 체제 경로에 직접 접근하면 프로그램의 이식성이 떨어질 수 있다. 자바는 이식 가능한 프로그램을 지원하기 위해 `/`와 `\`로 구분된 경로를 구별하는 `File.separator`를 사용한다. Seed7은 경로 표현에 대해 다른 접근 방식을 가진다. Seed7에서는 모든 경로가 운영 체제에 관계없이 유닉스 경로 규칙을 사용한다. 윈도우에서는 매핑이 이루어진다(예: 경로 `/c/users`는 `c:\users`로 매핑된다).
7. 범용 명명 규칙 (UNC)
Universal Naming Convention영어 또는 Uniform Naming Convention영어의 약자인 UNC는 공유 파일, 디렉토리, 프린터와 같은 네트워크 리소스를 지정하는 데 사용되는 윈도우 시스템의 일반적인 구문이다.
UNC 구문 형식은 다음과 같다.
`\\ComputerName\SharedFolder\Resource`
마이크로소프트는 종종 이것을 네트워크 경로라고 부른다.
일부 마이크로소프트 윈도우 인터페이스는 WebDAV 공유 접근을 위해 URL 대신 UNC 구문을 허용하거나 요구한다. UNC 구문은 SSL 및 TCP/IP 포트 번호 사용을 나타내는 구성 요소를 추가하여 확장될 수 있다. `http[s]://HostName[:Port]/SharedFolder/Resource`의 WebDAV URL은 다음과 같이 표현된다.
`\\HostName[@SSL][@Port]\SharedFolder\Resource`
원격으로 볼 때, "SharedFolder"는 서버의 프로그램이 "\SharedFolder"를 열 때 표시되는 것과 다른 이름을 가질 수 있다. 대신, SharedFolder 이름은 "공유"를 정의할 때 폴더에 할당된 임의의 이름으로 구성된다.
일부 마이크로소프트 윈도우 인터페이스는 "Long UNC"도 허용한다.
`\\?\UNC\ComputerName\SharedFolder\Resource`
8. POSIX 경로 이름 정의
POSIX는 유닉스 계열 시스템에서 경로 이름에 대한 표준을 정의한다. POSIX는 슬래시 두 개(//)로 시작하는 경로를 구현에 따라 다르게 처리할 수 있도록 허용하지만, 그 외의 경우 시스템은 여러 개의 슬래시를 하나의 슬래시(/)로 처리해야 한다.
9. 예제
경로는 크게 유닉스 스타일과 MS-DOS/윈도우 스타일로 나눌 수 있다.
유닉스 스타일과 MS-DOS/윈도우 스타일의 경로 예제를 통해 경로 사용법을 살펴본다. 자세한 내용은 각 스타일의 하위 섹션을 참고한다.
윈도우 시스템 API는 슬래시(/)를 허용하지만, cmd.exe 셸 등 많은 윈도우 응용 프로그램은 슬래시를 다른 목적으로 해석하거나 유효하지 않은 문자로 처리하므로 백슬래시(\)를 입력해야 한다. tcsh 및 Windows PowerShell과 같이 윈도우에서 사용할 수 있는 다른 셸은 슬래시를 허용한다.
"\"는 "현재 디스크"의 루트를 나타내며, 현재 디스크가 아닌 디스크의 파일을 나타내려면 드라이브 문자 다음에 콜론(예: C:)을 붙여야 한다. UNC 이름(`\\`로 시작하는 경로)은 슬래시를 지원하지 않는다.
9.1. 유닉스 스타일 예제
유닉스 스타일 파일 시스템의 동작을 터미널 또는 터미널 응용 프로그램(명령줄 창)에서 볼 수 있는 방식으로 설명하는 예시는 다음과 같다.
현재 작업 디렉토리가 `/users/mark/`라고 가정한다.
현재 작업 디렉토리를 `/users/mark/bobapples`로 변경하려는 경우, 원하는 디렉토리의 상대 경로는 다음과 같다.
* `./bobapples`
* 또는 간단하게 `bobapples`
디렉토리의 절대 경로는 다음과 같다.
* `/users/mark/bobapples`
원하는 디렉토리의 상대 경로로 `bobapples`가 주어지면, 현재 작업 디렉토리를 `bobapples`로 변경하기 위해 명령 프롬프트에서 다음을 입력할 수 있다.
* cd bobapples
두 개의 점(`..`)은 계층 구조에서 위로 올라가 상위 디렉토리를 나타내고, 한 개의 점(`.`)은 현재 디렉토리 자체를 나타낸다. 두 점 모두 복잡한 상대 경로의 구성 요소가 될 수 있다(예: `../mark/./bobapples`). 여기서 `.`는 단독으로 또는 이러한 상대 경로의 첫 번째 구성 요소로 작업 디렉토리를 나타낸다. 현재 작업 디렉토리에서 파일 `foo`를 참조하기 위해 `./foo`를 사용하는 것은 기본 디렉토리 또는 다른 수단을 통해 찾을 수 있는 리소스 `foo`와 구별하는 데 유용할 수 있다. (예를 들어, 시스템에 설치된 매뉴얼 페이지 대신 특정 버전을 보려는 경우)
9.2. MS-DOS/윈도우 스타일 예제
윈도우 시스템 API는 슬래시(/)를 허용하지만, 많은 응용 프로그램, 특히 cmd.exe 셸은 슬래시를 다르게 해석하거나 유효하지 않은 문자로 처리하므로 백슬래시(\)를 사용해야 한다. tcsh 및 Windows PowerShell과 같은 다른 셸에서는 슬래시를 사용할 수 있다.
\는 현재 디스크의 루트를 나타내며, 다른 디스크의 파일을 나타내려면 드라이브 문자(예: C:)를 사용해야 한다. UNC 이름( `\\`로 시작하는 경로)은 슬래시를 지원하지 않는다.
다음은 MS-DOS/윈도우 스타일 경로의 예시이다.
* `A:\Temp\File.txt`: 드라이브 A의 루트 디렉터리에 있는 `Temp` 디렉터리의 `File.txt` 파일을 가리킨다.
* `C:..\File.txt`: 드라이브 C의 현재 디렉터리의 상위 디렉터리에 있는 `File.txt` 파일을 참조한다.
* `Folder\SubFolder\File.txt`: 현재 드라이브의 현재 디렉터리에 있는 `Folder` 디렉터리의 `SubFolder` 디렉터리에 있는 `File.txt` 파일을 나타낸다.
* `File.txt`: 현재 드라이브의 현재 디렉터리에 있는 `File.txt` 파일을 가리킨다.
* `\\.\COM1`: 첫 번째 직렬 포트 (COM1)를 참조한다.
다음은 슬래시를 디렉터리 구분 기호로 사용한 예시이다.
```doscon
C:\>more < C:/Windows/system.ini
; for 16-bit app support
[386Enh]
woafont=dosapp.fon
EGA80WOA.FON=EGA80WOA.FON
EGA40WOA.FON=EGA40WOA.FON
CGA80WOA.FON=CGA80WOA.FON
CGA40WOA.FON=CGA40WOA.FON
...
```
이 예제에서는 `more` 명령어를 사용하여 `C:/Windows/system.ini` 파일의 내용을 표시한다.
다음은 명령줄 스위치와 구별하기 위해 경로를 큰따옴표로 묶은 예시이다.
```doscon
E:\>dir "/Folder/SubFolder/" /Q
Volume in drive E is Data
Volume Serial Number is 07BE-0B10
Directory of E:\Folder\SubFolder
18 October 2008 08:15 AM
18 October 2008 08:15 AM
18 October 2008 08:15 AM
1 File(s) 8 bytes
2 Dir(s) 19,063,000 bytes free
```
`CD` 명령어에서는 예외적으로 `/D` 스위치를 사용하여 현재 드라이브를 변경할 수 있다.
경로 이름에 공백이 있으면 스크립트가 중단될 수 있으므로, 환경 변수를 설정할 때는 공백이 없는 8.3 파일 이름을 사용해야 하는 경우가 있다. 다음 명령어를 사용하여 루트 바로 아래의 모든 디렉터리에 대한 8.3 파일 이름을 확인할 수 있다.
```doscon
C:\>dir /x
```
(사용자는 드라이브별로 8.3 파일 이름 생성을 비활성화할 수 있다.)