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은 마지막 이름을 제외한 디렉터리 부분을 출력합니다.









