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 / 명령어 / info - GNU 문서 확인

Linux / 명령어 / info - GNU 문서 확인

info 명령어로 GNU 설명서를 탐색하는 방법을 설명합니다. 노드와 메뉴 이동, 본문·색인 검색, 특정 문서 위치 지정, 텍스트 출력과 문서가 없을 때의 해결 방법을 정리합니다.

Linux / 명령어 / wc - 줄·단어·문자 수 계산

Linux / 명령어 / wc - 줄·단어·문자 수 계산

Linux wc 명령어로 줄·단어·바이트·문자 수를 확인하는 방법을 설명합니다. 개행 기준의 줄 수, -c와 -m 차이, 여러 파일 합계와 안전한 파이프 활용 예제를 정리합니다.

Linux / 명령어 / cd - 디렉터리 이동

Linux / 명령어 / cd - 디렉터리 이동

Linux cd 명령어로 절대·상대 경로, 홈과 이전 디렉터리로 이동하는 방법을 설명합니다. 심볼릭 링크 처리, CDPATH, 스크립트와 sudo cd의 한계 및 오류 해결법도 정리합니다.

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux tail 명령어로 파일의 마지막 행과 바이트를 확인하고 새로 추가되는 로그를 추적하는 방법을 설명합니다. -n, -f, -F 차이와 로그 로테이션, 필터링 및 여러 파일 모니터링 예제를 정리합니다.

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux dd 명령어로 파일과 블록 장치 데이터를 복사하고 변환하는 방법을 설명합니다. if와 of, 블록 크기, 진행률, 디스크 이미지 생성·복원 및 대상 장치 오지정 위험을 정리합니다.

Linux / 명령어 / killall - 이름이 같은 프로세스에 시그널 보내기

Linux / 명령어 / killall - 이름이 같은 프로세스에 시그널 보내기

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

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux less 명령어로 긴 텍스트와 명령 출력을 페이지 단위로 탐색하는 방법을 설명합니다. 검색, 이동, 실시간 갱신과 파이프 사용법을 정리합니다.

Linux / 명령어 / zypper - openSUSE·SUSE에서 패키지와 저장소 관리

Linux / 명령어 / zypper - openSUSE·SUSE에서 패키지와 저장소 관리

Linux zypper 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux / 명령어 / join - 공통 필드로 두 파일 결합

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

Linux / 명령어 / nmap - 허가된 호스트의 포트와 서비스 조사

Linux / 명령어 / nmap - 허가된 호스트의 포트와 서비스 조사

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