{{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}}