목차

, , , ,

dirname

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

Summary

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...

Options

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

Help

dirname --help (GNU coreutils 8.30)

See Also

History