{{tag>[cli dirname coreutils path shell]}}
====== 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 =====
++++ dirname --help (GNU coreutils 8.30) |
Usage: dirname [OPTION] NAME...
Output each NAME with its last non-slash component and trailing slashes
removed; if NAME contains no /'s, output '.' (meaning the current directory).
-z, --zero end each output line with NUL, not newline
--help display this help and exit
--version output version information and exit
Examples:
dirname /usr/bin/ -> "/usr"
dirname dir1/str dir2/str -> "dir1" followed by "dir2"
dirname stdio.h -> "."
GNU coreutils online help:
Report dirname translation bugs to
Full documentation at:
or available locally via: info '(coreutils) dirname invocation'
++++
===== See Also =====
* [[:linux:cli:basename]]
* [[:linux:cli:realpath:ko]]
* [[https://www.gnu.org/software/coreutils/manual/html_node/dirname-invocation.html|GNU Coreutils: dirname invocation]]
* [[https://formulae.brew.sh/formula/coreutils|Homebrew Formulae: coreutils]]
===== History =====
* codex:: 2026-08-17 기존 dirname 명령과 option 기록을 보존하고 설치, path 처리, 안전한 shell 사용법, 호환성 문서를 추가했다.
{{indexmenu>.#1|js}}