Linux / 명령어 / cd - 디렉터리 이동
cd는 Linux 셸에서 현재 작업 디렉터리를 바꾸는 명령입니다. 절대 경로와 상대 경로로 이동할 수 있으며, 인수 없이 홈 디렉터리로 이동하거나 cd -로 직전 디렉터리로 돌아갈 수도 있습니다.
cd는 현재 셸의 상태를 바꿔야 하므로 외부 실행 파일이 아니라 셸 내장 명령입니다. 이 글은 Bash를 기준으로 경로 이동, 심볼릭 링크 처리, CDPATH와 스크립트에서의 안전한 사용법을 설명합니다.
cd 명령어란?
cd는 change directory의 약자로, 셸의 현재 작업 디렉터리(current working directory)를 변경합니다. 이후 상대 경로로 실행하는 명령은 변경된 디렉터리를 기준으로 파일과 디렉터리를 찾습니다.
현재 위치는 pwd로 확인할 수 있습니다.
pwd cd /var/log pwd
type cd를 실행하면 Bash 내장 명령이라는 사실을 확인할 수 있습니다. 별도의 프로그램으로 실행하면 자식 프로세스의 디렉터리만 바뀌고 부모 셸에는 영향을 줄 수 없기 때문에 셸이 직접 구현합니다.
기본 문법
cd [-L] [-@] [디렉터리] cd -P [-e] [-@] [디렉터리]
일반적으로는 이동할 디렉터리만 지정합니다.
cd /etc cd projects
이동에 성공하면 종료 상태 0을 반환하고, 경로가 없거나 권한이 부족한 경우에는 0이 아닌 값을 반환합니다. 성공 여부가 중요한 스크립트에서는 종료 상태를 확인해야 합니다.
절대 경로와 상대 경로로 이동하기
절대 경로 사용하기
루트 디렉터리 /에서 시작하는 절대 경로는 현재 위치와 관계없이 같은 대상을 가리킵니다.
cd /var/log cd /usr/local/bin cd /
운영 절차나 스크립트에서 기준 위치가 명확해야 한다면 절대 경로가 이해하기 쉽습니다.
상대 경로 사용하기
상대 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.
cd documents cd projects/web cd ../backup
같은 명령이라도 실행하는 현재 위치에 따라 다른 디렉터리로 이동하거나 실패할 수 있습니다. 이동 전후 위치가 중요하면 pwd로 확인하세요.
홈, 상위 및 이전 디렉터리로 이동하기
홈 디렉터리로 이동하기
인수 없이 cd를 실행하면 HOME 변수로 지정된 사용자의 홈 디렉터리로 이동합니다. 물결표 확장을 사용한 cd ~도 일반적으로 같은 결과입니다.
cd cd ~ cd ~/Downloads
다른 사용자의 홈 디렉터리는 시스템 계정 정보에 따라 ~사용자명으로 참조할 수 있습니다.
cd ~alice
해당 사용자가 존재하지 않거나 홈 경로에 접근할 권한이 없으면 이동할 수 없습니다.
현재 및 상위 디렉터리 표현하기
점 하나 .은 현재 디렉터리, 점 두 개 ..은 상위 디렉터리를 뜻합니다.
cd . cd .. cd ../.. cd ../../shared
cd .은 보통 위치를 바꾸지 않습니다. 여러 단계 위로 이동할 때는 각 단계마다 ../를 사용합니다. ...처럼 점 세 개를 상위 두 단계로 해석하는 기능은 표준 Bash 동작이 아닙니다.
직전 디렉터리로 돌아가는 cd -
cd -는 OLDPWD에 저장된 직전 작업 디렉터리로 이동하며, 성공하면 새 경로를 출력합니다.
cd /etc cd /var/log cd -
두 디렉터리를 번갈아 확인할 때 편리합니다. 현재 셸에서 이전 디렉터리 정보가 아직 만들어지지 않았다면 OLDPWD not set 오류가 발생할 수 있습니다.
공백과 특수 문자가 있는 경로
따옴표로 경로 묶기
공백이 있는 경로는 하나의 인수로 전달되도록 따옴표로 묶습니다.
cd "Project Files" cd '/srv/shared data'
변수를 경로로 사용할 때도 값이 여러 단어로 나뉘거나 glob으로 확장되지 않도록 큰따옴표로 묶는 것이 안전합니다.
target='/srv/shared data' cd -- "$target"
백슬래시와 옵션처럼 보이는 이름
공백 앞에 백슬래시를 붙여 이스케이프할 수도 있습니다.
cd Project\ Files
이름이 하이픈으로 시작하면 옵션으로 오해되지 않도록 ./를 붙이거나 옵션 종료 표시 --를 사용합니다.
cd ./-archive cd -- -archive
탭 자동 완성을 사용하면 셸이 경로의 공백과 특수 문자를 적절히 이스케이프해 주므로 오타를 줄일 수 있습니다.
PWD와 OLDPWD 이해하기
현재 위치를 나타내는 PWD
Bash는 이동에 성공하면 PWD 변수에 새 작업 디렉터리를 저장합니다. pwd 명령과 비교해 현재 셸이 기억하는 논리적 경로를 확인할 수 있습니다.
printf '%s\n' "$PWD" pwd
~+도 Bash의 물결표 확장에서 PWD 값으로 치환됩니다.
printf '%s\n' ~+
이전 위치를 나타내는 OLDPWD
이동이 성공하면 기존 작업 디렉터리가 OLDPWD에 저장됩니다. cd -는 이 값을 사용합니다.
printf '%s\n' "$OLDPWD" printf '%s\n' ~-
셸 시작 직후나 아직 디렉터리를 이동하지 않은 상황에서는 OLDPWD가 없을 수 있습니다.
심볼릭 링크와 -L, -P 옵션
심볼릭 링크가 포함된 경로에서는 셸이 기억하는 논리적 경로와 파일 시스템에서 해석한 물리적 경로가 다를 수 있습니다.
논리적 경로를 유지하는 -L
-L은 기본 동작으로, 경로의 ..을 논리적인 경로 구성 요소를 기준으로 처리합니다. 심볼릭 링크 이름을 통해 이동했다면 PWD에도 그 이름이 유지될 수 있습니다.
cd -L /srv/current pwd
사용자가 입력한 경로 구조를 유지하므로 프로젝트 링크나 현재 릴리스 링크를 따라 작업할 때 이해하기 쉽습니다.
물리적 경로를 따르는 -P
-P는 이동 과정에서 심볼릭 링크를 물리적 대상 경로로 해석합니다. 실제 파일 시스템 위치를 확인하거나 링크 대상 기준으로 ..을 처리해야 할 때 사용합니다.
cd -P /srv/current pwd -P
-e는 -P와 함께 사용할 때 이동 후 현재 물리 경로를 확정할 수 없으면 실패 상태를 반환하게 합니다.
cd -P -e /srv/current
CDPATH로 자주 가는 위치 검색하기
CDPATH는 cd가 슬래시로 시작하지 않는 디렉터리 이름을 찾을 때 사용할 검색 경로입니다. 실행 파일을 찾는 PATH와 비슷하지만 디렉터리 이동에만 적용됩니다.
CDPATH 설정 예제
CDPATH=.:~/projects:/srv/apps export CDPATH cd sample-app
콜론으로 구분한 각 위치에서 sample-app을 찾습니다. 빈 항목 또는 .은 현재 디렉터리를 뜻합니다. 현재 위치의 같은 이름을 우선하려면 .을 앞에 두는 방식이 이해하기 쉽습니다.
CDPATH 사용 시 주의점
cd가 비어 있지 않은 CDPATH 항목에서 디렉터리를 찾으면 이동한 절대 경로를 표준 출력으로 표시할 수 있습니다. 대화형 셸에서는 편리하지만 스크립트 출력에 예상하지 못한 경로가 섞일 수 있습니다.
자동화에서는 절대 경로나 명확한 상대 경로를 사용하고, 필요하면 CDPATH=로 해당 명령에서 검색 경로의 영향을 제거하세요.
CDPATH= cd -- ./build
이동이 성공했을 때만 다음 명령 실행하기
cd가 실패했는데 다음 명령을 계속 실행하면 의도하지 않은 디렉터리에서 파일을 만들거나 삭제할 수 있습니다. 논리 연산자로 성공 여부를 연결하는 것이 안전합니다.
cd /srv/app && ./deploy.sh
여러 줄의 스크립트에서는 실패 시 명시적으로 종료하거나 오류를 처리합니다.
cd /srv/app || {
printf '%s\n' '작업 디렉터리로 이동할 수 없습니다.' >&2
exit 1
}
./deploy.sh
cd 경로; 명령처럼 세미콜론만 사용하면 이동 실패와 관계없이 다음 명령이 실행됩니다.
스크립트와 서브셸에서 cd 사용하기
스크립트가 부모 셸의 위치를 바꿀 수 없는 이유
일반 실행한 셸 스크립트는 별도의 프로세스에서 동작하므로 스크립트 안의 cd는 그 프로세스와 자식에게만 영향을 줍니다. 스크립트가 끝난 뒤 호출한 터미널의 작업 디렉터리는 그대로입니다.
./change-directory.sh pwd
현재 셸의 위치를 바꾸려면 함수를 정의하거나 스크립트를 source로 실행할 수 있지만, sourced 스크립트는 현재 셸의 변수와 옵션까지 바꿀 수 있으므로 신뢰할 수 있는 내용인지 확인해야 합니다.
source ./change-directory.sh
작업 후 원래 위치를 유지하는 서브셸
특정 디렉터리에서만 작업하고 호출한 셸의 위치를 유지하려면 괄호로 서브셸을 만들 수 있습니다.
( cd /srv/app && ./build.sh )
괄호 안의 디렉터리 변경은 서브셸이 끝나면 사라집니다. 현재 셸에서 이동했다가 돌아오려면 기존 경로를 직접 저장하는 대신 pushd와 popd도 사용할 수 있습니다.
sudo cd가 동작하지 않는 이유
sudo cd /root는 일반적으로 사용할 수 없습니다. cd는 현재 셸의 내장 명령이고, sudo가 시작한 다른 프로세스가 부모 셸의 작업 디렉터리를 바꿀 수 없기 때문입니다.
관리자 셸 자체가 필요한 경우에는 권한 정책에 맞게 다음과 같은 방식으로 새 로그인 셸을 시작할 수 있습니다.
sudo -i
한 명령만 특정 디렉터리에서 관리자 권한으로 실행하려면 현재 셸에서 이동한 뒤 해당 명령에만 sudo를 적용하거나, 별도 셸에 작업 경로와 명령을 명시합니다.
cd /srv/app && sudo ./maintenance.sh sudo sh -c 'cd /srv/app && ./maintenance.sh'
관리자 권한은 필요한 범위에만 사용하고, 경로와 실행 파일을 신뢰할 수 있는지 확인하세요.
cd, pushd와 popd 비교
| 명령 | 주요 용도 | 특징 |
|---|---|---|
cd |
지정한 디렉터리로 이동합니다. | OLDPWD를 이용해 직전 위치 한 곳으로 돌아갈 수 있습니다. |
pushd |
현재 위치를 디렉터리 스택에 저장하면서 이동합니다. | 여러 위치를 오갈 때 유용하며 Bash가 스택을 관리합니다. |
popd |
스택 항목을 제거하고 해당 위치로 이동합니다. | pushd와 짝을 이루며 저장한 위치를 복원합니다. |
dirs |
현재 디렉터리 스택을 확인합니다. | 이동하지 않고 스택 상태만 표시할 수 있습니다. |
자주 사용하는 이동 명령
| 명령 | 설명 |
|---|---|
cd |
현재 사용자의 홈 디렉터리로 이동합니다. |
cd ~ |
물결표 확장을 이용해 홈 디렉터리로 이동합니다. |
cd .. |
상위 디렉터리로 이동합니다. |
cd ../.. |
두 단계 위의 디렉터리로 이동합니다. |
cd - |
직전 작업 디렉터리로 돌아갑니다. |
cd / |
파일 시스템의 루트 디렉터리로 이동합니다. |
cd ~/projects |
홈 아래의 projects 디렉터리로 이동합니다. |
cd -P 경로 |
심볼릭 링크를 해석한 물리적 경로를 따라 이동합니다. |
옵션 정리
| 옵션 | 설명 |
|---|---|
-L |
논리적 경로를 사용합니다. Bash의 기본 동작이며 심볼릭 링크 이름을 경로에 유지할 수 있습니다. |
-P |
심볼릭 링크를 물리적 대상 경로로 해석해 이동합니다. |
-e |
-P와 함께 사용하며, 이동 후 물리적 현재 경로를 확정하지 못하면 실패 상태를 반환합니다. |
-@ |
지원하는 시스템에서 파일의 확장 속성을 디렉터리처럼 표시합니다. 일반적인 Linux 환경에서는 지원되지 않을 수 있습니다. |
-- |
옵션의 끝을 나타내며 하이픈으로 시작하는 디렉터리 이름을 인수로 처리할 때 사용합니다. |
자주 발생하는 오류
No such file or directory
경로가 존재하지 않거나 현재 위치를 잘못 가정했을 수 있습니다. pwd로 기준 위치를 확인하고, 경로의 대소문자와 공백을 점검하세요.
pwd ls -ld -- "대상 경로"
Permission denied
대상 디렉터리 또는 경로의 중간 디렉터리에 탐색 권한이 없을 수 있습니다. 디렉터리로 이동하려면 경로를 구성하는 각 디렉터리에 실행 권한이 필요합니다.
namei -l /path/to/directory
권한을 임의로 넓히기 전에 해당 경로에 접근해야 하는 사용자인지와 적절한 그룹 또는 ACL 정책을 확인하세요.
Not a directory
경로의 마지막 항목이나 중간 구성 요소가 일반 파일일 수 있습니다. file과 ls -ld로 유형을 확인하세요.
file -- "대상 경로" ls -ld -- "대상 경로"
FAQ
cd 명령을 실행했는데 아무 출력도 없는 것이 정상인가요?
정상입니다. 일반적인 경로로 이동에 성공한 cd는 출력하지 않습니다. 현재 위치는 pwd로 확인할 수 있으며, cd -나 CDPATH로 찾은 경로는 성공 시 새 경로를 출력할 수 있습니다.
상위 디렉터리로 두 단계 이동하려면 어떻게 하나요?
cd ../..을 사용합니다. 각 ..이 상위 디렉터리 한 단계를 뜻하며 슬래시로 연결합니다.
스크립트로 현재 터미널의 디렉터리를 바꿀 수 있나요?
일반 실행한 스크립트는 부모 셸의 디렉터리를 바꿀 수 없습니다. 현재 셸에 영향을 주려면 셸 함수나 source가 필요하지만, 현재 셸의 다른 상태도 바꿀 수 있으므로 신뢰할 수 있는 코드에만 사용하세요.









