Linux / 명령어 / basename - 경로에서 마지막 이름 추출

basename은 경로 문자열에서 디렉터리 부분을 제거하고 마지막 파일명이나 디렉터리 이름만 출력하는 명령입니다. 선택적으로 파일명 끝의 접미사도 제거할 수 있어 셸 스크립트에서 경로를 표시용 이름으로 바꿀 때 유용합니다.

basename은 파일을 열거나 경로의 존재 여부를 확인하는 명령이 아닙니다. 입력받은 문자열을 가공하므로 존재하지 않는 경로에도 사용할 수 있습니다.

basename 명령어란?

경로의 마지막 구성 요소만 필요할 때 basename을 사용합니다.

basename /home/user/report.txt

출력은 다음과 같습니다.

report.txt

입력 경로가 파일인지 디렉터리인지는 중요하지 않습니다. 마지막 슬래시가 정리된 뒤 마지막 이름을 반환합니다.

기본 문법과 사용법

basename 이름 [접미사]
basename 옵션 이름 ...

가장 기본적인 사용 예는 다음과 같습니다.

basename /var/log/nginx/access.log
basename /home/user/Documents/
basename relative/path/file.txt

각 결과는 access.log, Documents, file.txt입니다. 경로 끝의 불필요한 슬래시는 제거되지만 루트 경로처럼 특별한 입력은 별도로 처리됩니다.

접미사 제거하기

두 번째 인수로 접미사 지정하기

이름 뒤에 접미사를 지정하면 마지막 이름이 그 문자열로 끝날 때 제거합니다.

basename /data/archive.tar.gz .gz
basename /home/user/report.txt .txt

출력은 각각 archive.tar와 report입니다. .tar.gz 전체를 없애려면 제거할 문자열 전체를 지정합니다.

basename /data/archive.tar.gz .tar.gz

-s로 여러 이름에서 접미사 제거하기

GNU basename의 -s 또는 --suffix는 접미사를 옵션으로 지정합니다. 이 옵션을 사용하면 여러 이름을 함께 처리하는 -a 동작도 활성화됩니다.

basename -s .jpg /images/a.jpg /backup/b.jpg
basename --suffix=.log /var/log/app.log /tmp/test.log

접미사가 일치하지 않으면 원래 마지막 이름을 그대로 출력합니다. 접미사는 정규식이 아니라 글자 그대로 비교하는 문자열입니다.

여러 경로 처리하기

-a로 여러 이름 출력하기

-a 또는 --multiple을 사용하면 여러 경로를 한 번에 처리하고 각 결과를 한 줄씩 출력합니다.

basename -a /srv/www/index.html /var/log/syslog /home/user

출력은 다음과 같은 형태입니다.

index.html
syslog
user

-z로 NUL 문자 구분하기

파일명에는 줄바꿈 문자가 포함될 수 있습니다. 자동화에서 모호함을 피하려면 -z 또는 --zero로 각 결과 끝에 줄바꿈 대신 NUL 문자를 출력할 수 있습니다.

basename -z -a /data/file1 /data/file2

NUL 구분 출력을 받는 다음 명령도 같은 형식을 지원해야 합니다. 화면에서 직접 확인하기 위한 옵션이 아니라 안전한 프로그램 간 전달을 위한 기능입니다.

basename과 dirname 비교

입력 basename dirname
/home/user/report.txt report.txt /home/user
docs/manual.pdf manual.pdf docs
notes.txt notes.txt .
/ / /

두 명령은 경로 문자열을 서로 보완적으로 나눌 때 편리합니다. 다만 출력 두 개를 단순히 슬래시로 다시 연결하면 중복 슬래시나 특수 입력 때문에 원본 문자열과 정확히 같아지지 않을 수 있습니다.

파일 확장자 처리하기

알고 있는 확장자 제거하기

제거할 확장자가 정해져 있다면 접미사 인수를 사용하는 방법이 명확합니다.

basename photo.webp .webp
basename backup.tar.gz .tar.gz

이 방식은 끝부분이 정확히 일치할 때만 제거하므로 report.txt.bak에서 .txt는 제거되지 않습니다.

마지막 점 이후를 무조건 확장자로 보지 않기

파일명에 점이 있다고 해서 항상 확장자가 있는 것은 아닙니다. .profile처럼 점으로 시작하는 숨김 파일, archive.tar.gz처럼 여러 접미사가 있는 파일, 점으로 끝나는 이름도 있습니다.

업무 규칙에 따라 제거할 접미사를 명확히 정하고, 단순히 마지막 점 이후를 모두 삭제하는 처리는 신중하게 사용하세요.

셸 스크립트에서 활용하기

경로에서 표시용 파일명 얻기

path='/srv/uploads/annual report.pdf'
name=$(basename -- "$path") || exit 1
printf '파일명: %s\n' "$name"

--는 이후 문자열을 옵션이 아니라 이름으로 처리하게 합니다. 하이픈으로 시작할 수 있는 입력을 다룰 때 유용하며, 변수는 항상 큰따옴표로 묶는 것이 안전합니다.

POSIX 셸 매개변수 확장과 비교하기

셸 안에서 한 경로의 마지막 부분만 필요하다면 외부 명령 대신 매개변수 확장을 사용할 수도 있습니다.

path='/srv/uploads/report.pdf'
name=${path##*/}
printf '%s\n' "$name"

그러나 경로가 슬래시로 끝나거나 루트 경로인 경우 basename과 결과가 다를 수 있습니다. 입력 형식이 통제되지 않는다면 직접 만든 문자열 규칙과 basename의 동작을 동일하다고 가정하지 마세요.

주요 옵션 정리

옵션 설명
-a, --multiple 여러 이름을 처리하고 각각의 결과를 출력합니다.
-s 접미사, --suffix=접미사 각 이름 끝에서 지정한 접미사를 제거하며 여러 이름 처리도 활성화합니다.
-z, --zero 각 결과를 줄바꿈이 아닌 NUL 문자로 끝냅니다.
--help 사용법과 지원 옵션을 출력합니다.
--version 설치된 GNU Coreutils 버전을 출력합니다.

-a, -s, -z 같은 옵션은 GNU 확장입니다. 다양한 Unix 계열에서 실행할 스크립트라면 대상 시스템의 구현을 확인하고 POSIX에서 규정한 기본 형식을 우선하세요.

자주 발생하는 문제

파일이 없어도 결과가 출력됨

정상적인 동작입니다. basename은 파일의 존재를 확인하지 않고 입력 문자열에서 마지막 부분을 추출합니다. 실제 파일이 필요한 작업이라면 별도의 존재 여부와 권한 검사를 해야 합니다.

공백이 있는 경로가 여러 인수로 나뉨

변수를 큰따옴표로 묶지 않으면 셸의 단어 분리와 glob 확장이 일어날 수 있습니다.

basename -- "$path"

접미사가 제거되지 않음

접미사는 마지막 이름의 끝과 정확히 일치해야 합니다. 대소문자도 구분되며 정규식이나 와일드카드로 해석되지 않습니다.

FAQ

basename은 실제 파일명을 바꾸나요?

아닙니다. 입력한 경로 문자열에서 마지막 이름을 계산해 출력할 뿐 파일이나 디렉터리를 변경하지 않습니다.

basename으로 확장자를 제거할 수 있나요?

basename 경로 .txt처럼 제거할 접미사를 두 번째 인수로 지정할 수 있습니다. GNU 환경에서 여러 이름을 처리하려면 basename -s .txt 이름...을 사용할 수 있습니다.

basename은 존재하지 않는 경로에서도 작동하나요?

네. 경로 문자열만 처리하므로 실제 파일이 없어도 마지막 구성 요소를 출력합니다.

dirname과 차이는 무엇인가요?

basename은 마지막 이름을 출력하고, dirname은 마지막 이름을 제외한 디렉터리 부분을 출력합니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux awk 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / last - 로그인 기록과 시스템 부팅 이력 확인

Linux / 명령어 / last - 로그인 기록과 시스템 부팅 이력 확인

Linux last 명령어로 사용자 로그인·로그아웃, 재부팅과 실패한 로그인 이력을 확인하는 방법을 설명합니다. wtmp·btmp, 기간 필터, 상태 해석과 보안 조사 시 한계를 함께 정리합니다.

Linux / 리눅스 역사 - 1991년 취미 프로젝트가 세계 인프라가 되기까지

Linux / 리눅스 역사 - 1991년 취미 프로젝트가 세계 인프라가 되기까지

리눅스는 1991년 시작된 커널 프로젝트에서 서버·클라우드·모바일을 떠받치는 기반 기술로 성장했습니다. UNIX와 GNU의 배경부터 배포판과 공동 개발 생태계의 확장까지 핵심 연표로 정리합니다.

Linux / 명령어 / groups - 사용자의 그룹 소속 확인

Linux / 명령어 / groups - 사용자의 그룹 소속 확인

Linux groups 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

whatis 명령어로 매뉴얼 페이지의 한 줄 설명과 섹션을 확인하는 방법을 설명합니다. 정규 표현식·와일드카드 검색, apropos·type과의 차이 및 색인 문제 해결법을 정리합니다.

Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux reboot 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

PID와 PPID의 의미와 부모·자식 프로세스의 관계를 설명합니다. ps와 pgrep으로 확인하고, 직접 만든 실습 프로세스를 안전하게 종료하는 방법을 익힙니다.

Linux / 명령어 / clear - 터미널 화면 정리

Linux / 명령어 / clear - 터미널 화면 정리

Linux clear 명령어로 터미널 화면을 정리하는 방법을 설명합니다. 스크롤백을 보존하는 -x 옵션과 Ctrl+L·reset·tput의 차이, TERM 오류 해결법을 다룹니다.

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.

Linux / 명령어 / rm - 파일과 디렉터리 삭제

Linux / 명령어 / rm - 파일과 디렉터리 삭제

Linux rm 명령어로 파일과 디렉터리를 삭제하는 방법을 설명합니다. 재귀 삭제, 대화형 확인, 루트 보호 옵션과 복구가 어려운 삭제를 안전하게 다루는 원칙을 정리합니다.