linux:cli:dirname:ko

dirname

dirname은 각 path에서 마지막 component를 제거하고 남은 directory 부분을 출력하는 command-line 도구다.

  • filesystem을 조회하지 않고 입력 문자열을 path 규칙에 따라 처리한다.
  • slash가 없는 이름은 현재 directory를 뜻하는 .으로 출력한다.
  • 여러 NAME을 주면 입력마다 결과를 한 줄씩 출력한다.

dirname은 GNU coreutils package에 포함된다.

sudo apt update
sudo apt install coreutils
sudo dnf install coreutils

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

GNU Coreutils가 공식 제공하는 native WinGet package는 없다. WSL을 사용하는 경우 해당 Linux distribution의 package manager로 coreutils를 설치한다. PowerShell에서 directory 부분만 필요하면 Split-Path -Parent도 검토한다.

GNU 구현은 다음 명령으로 version을 확인할 수 있다. BSD 구현은 –version을 지원하지 않을 수 있다.

dirname --version
dirname [OPTION] NAME...
  • dirname [OPTION] NAME…
  • 마지막 non-slash component와 뒤따르는 slash를 제거한 결과를 출력한다.
  • option으로 해석될 수 있는 이름은 뒤에 둔다.
  • -z, –zero: 각 결과를 newline 대신 NUL byte로 끝낸다.
  • –help: 도움말을 출력하고 종료한다.
  • –version: GNU coreutils version 정보를 출력하고 종료한다.
dirname /usr/bin/
dirname dir1/str dir2/str
dirname stdio.h

출력은 차례로 /usr, dir1, dir2, .이다.

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'

다음 표현은 호출 위치 기준의 문자열 directory를 구할 뿐 symbolic link를 완전히 해석하지 않는다.

script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) || exit 1
printf '%s\n' "$script_dir"

symbolic link까지 해석해야 한다면 대상 platform의 realpath 동작을 확인한다.

입력에 slash가 없으면 dirname은 현재 directory를 뜻하는 .을 반환한다. 실제 file 존재 여부와는 관계없다.

dirname은 symbolic link를 따라가지 않는다. canonical path가 필요하면 realpath로 먼저 정규화한 뒤 처리한다.

dirname -- "$(realpath -- ./link)"

hyphen으로 시작하는 path 앞에 option 종료자 를 둔다.

dirname -- -report/output.txt
  • dirname의 기본 동작은 POSIX에 정의되어 있지만 -z, –help, –version은 GNU extension이다.
  • GNU, BSD, BusyBox 구현은 기본 path 처리에는 대체로 호환되지만 long option 지원은 다를 수 있다.
  • POSIX shell의 ${variable%/*}는 slash가 없는 값, root path, trailing slash에서 dirname과 결과가 다를 수 있으므로 단순 대체로 가정하지 않는다.

dirname --help (GNU coreutils 8.30)

  • codex:: 2026-08-17 기존 dirname 명령과 option 기록을 보존하고 설치, path 처리, 안전한 shell 사용법, 호환성 문서를 추가했다.
  • /home/u613600155/domains/cli.zerotymer.net/public_html/data/pages/linux/cli/dirname/ko.txt
  • 마지막으로 수정됨: 2026/08/17 03:47
  • (바깥 편집)