다음은 파일 경로의 예입니다.
/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt
내가 얻고 싶은 것은 파일 기본 이름입니다.
VMN CRTro.txt
그래서 나는 다음을 시도합니다.
echo /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt | sed s'/\// /g' | awk '{print $NF}'
CRTro.txt <-- not as expected
또는
basename /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt
basename: extra operand `Doma'
Try `basename --help' for more information. <-- basename cant handle spaces
공백이 있는 파일의 기본 이름을 얻는 가장 좋은 방법은 무엇입니까?
답변1
당신의 길을 인용해 보세요.
basename "/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
답변2
문제의 핵심은 인용이다. 따옴표가 없으면 파일 이름이 로 처리됩니다 basename
.
경로가 변수가 아닌 하드 세트이면 rob의 대답은 괜찮습니다. 그러나 이것이 변수가 사용되는 스크립트의 일부인 경우 두 가지 좋은 솔루션이 있습니다.
$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ basename "$filepath"
VMN CRTro.txt
그러나 basename
이는 외부 유틸리티이며 bash의 일부가 아닙니다. bash에는 또 다른 솔루션이 내장되어 있습니다.
$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ echo "${filepath##*/}"
VMN CRTro.txt
bash에게 가능한 한 많은 문자와 일치하는 ${filepath##*/}
glob을 실행한 다음 a를 제거하도록 지시합니다 .*/
/
답변3
여기에 있는 두 답변 모두 적절합니다. 비록 저는 개인적으로 Patrick이 제안한 대로 사용하고 싶습니다 ${var##*/}
. 하지만 단지 재미를 위해:
IFS=/ ; set -f
set -- ${0+/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt}
for p do i=$((i+1))
printf "arg#$i:\t%s\n" "${p:-/}"
done
echo now shift out...
shift $(($#-1))
printf 'arg#1:\t%s\n' "$1"
산출
arg#1: /
arg#2: isf
arg#3: GCM
arg#4: VPfig
arg#5: Aas
arg#6: AR
arg#7: ClCo el Doma Republic
arg#8: VMN CRTro.txt
now shift out...
arg#1: VMN CRTro.txt
$IFS
올바르게 설정하면 변수 평가가 소진될까 걱정할 필요가 없습니다. 당신은 그것을 유리하게 사용할 수도 있습니다.