복잡한 파일의 기본 이름을 얻는 방법

복잡한 파일의 기본 이름을 얻는 방법

다음은 파일 경로의 예입니다.

/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올바르게 설정하면 변수 평가가 소진될까 걱정할 필요가 없습니다. 당신은 그것을 유리하게 사용할 수도 있습니다.

관련 정보