dirname
dirname은 각 path에서 마지막 component를 제거하고 남은 directory 부분을 출력하는 command-line 도구다.
Summary
- filesystem을 조회하지 않고 입력 문자열을 path 규칙에 따라 처리한다.
- slash가 없는 이름은 현재 directory를 뜻하는
.으로 출력한다. - 여러
NAME을 주면 입력마다 결과를 한 줄씩 출력한다.
Installation
Debian / Ubuntu
dirname은 GNU coreutils package에 포함된다.
sudo apt update sudo apt install coreutils
RHEL / Fedora
sudo dnf install coreutils
macOS
macOS에는 BSD 계열 dirname이 기본 제공된다. GNU 구현이 필요하면 Homebrew의 coreutils formula를 설치한다. GNU command를 일반 이름으로 실행하려면 formula의 gnubin directory를 PATH 앞에 둘 수 있다.
brew install coreutils export PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:$PATH" dirname --version
Windows
GNU Coreutils가 공식 제공하는 native WinGet package는 없다. WSL을 사용하는 경우 해당 Linux distribution의 package manager로 coreutils를 설치한다. PowerShell에서 directory 부분만 필요하면 Split-Path -Parent도 검토한다.
설치 확인
GNU 구현은 다음 명령으로 version을 확인할 수 있다. BSD 구현은 –version을 지원하지 않을 수 있다.
dirname --version
Usage
dirname [OPTION] NAME...
dirname [OPTION] NAME…- 마지막 non-slash component와 뒤따르는 slash를 제거한 결과를 출력한다.
- option으로 해석될 수 있는 이름은
–뒤에 둔다.
Options
-z, –zero: 각 결과를 newline 대신 NUL byte로 끝낸다.–help: 도움말을 출력하고 종료한다.–version: GNU coreutils version 정보를 출력하고 종료한다.
Examples
기본 path 처리
dirname /usr/bin/ dirname dir1/str dir2/str dirname stdio.h
출력은 차례로 /usr, dir1, dir2, .이다.
shell 변수에서 상위 path 얻기
config_file=/etc/example/app.conf config_dir=$(dirname -- "$config_file") printf '%s\n' "$config_dir"
path에 공백이나 glob 문자가 있어도 한 argument로 전달되도록 변수를 quote한다.
여러 결과를 안전하게 전달하기
filename에 newline이 들어갈 수 있으면 GNU -z와 NUL 입력을 지원하는 downstream command를 함께 사용한다.
dirname -z -- ./one/file './two/file with spaces' | xargs -0 -n1 printf 'directory: %s\n'
script 자체의 directory 계산
다음 표현은 호출 위치 기준의 문자열 directory를 구할 뿐 symbolic link를 완전히 해석하지 않는다.
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) || exit 1 printf '%s\n' "$script_dir"
symbolic link까지 해석해야 한다면 대상 platform의 realpath 동작을 확인한다.
Troubleshooting
결과가 . 으로 나옴
입력에 slash가 없으면 dirname은 현재 directory를 뜻하는 .을 반환한다. 실제 file 존재 여부와는 관계없다.
symbolic link의 실제 directory가 아님
dirname은 symbolic link를 따라가지 않는다. canonical path가 필요하면 realpath로 먼저 정규화한 뒤 처리한다.
dirname -- "$(realpath -- ./link)"
이름이 option으로 처리됨
hyphen으로 시작하는 path 앞에 option 종료자 –를 둔다.
dirname -- -report/output.txt
Compatibility
dirname의 기본 동작은 POSIX에 정의되어 있지만-z,–help,–version은 GNU extension이다.- GNU, BSD, BusyBox 구현은 기본 path 처리에는 대체로 호환되지만 long option 지원은 다를 수 있다.
- POSIX shell의
${variable%/*}는 slash가 없는 값, root path, trailing slash에서dirname과 결과가 다를 수 있으므로 단순 대체로 가정하지 않는다.
Help
See Also
History
- codex:: 2026-08-17 기존 dirname 명령과 option 기록을 보존하고 설치, path 처리, 안전한 shell 사용법, 호환성 문서를 추가했다.