파일 /from/here/to/there.txt
이 있고 dirname to
대신 dirname의 마지막 부분 만 가져 오려면 /from/here/to
어떻게해야합니까?
답변:
basename
파일이 아니더라도 사용할 수 있습니다 . dirname
를 사용 하여 파일 이름을 제거한 다음을 사용 basename
하여 문자열의 마지막 요소를 가져옵니다.
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
그것을 설정할 때 앞에 달러가 있어서는 안되었다.
Bash 매개 변수 확장을 사용하면 다음 과 같이 할 수 있습니다.
path="/from/here/to/there.txt"
dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
외부 명령이 사용되지 않으므로 더 효율적입니다.
순수한 BASH 방법 :
s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
.
. 디렉토리에 점이 있으면 작동하지 않습니다 .
. 단순하게 유지하고 /
구분자로 슬래시 를 사용하십시오 .
한 가지 더
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
printf "%s\n" "${x[-2]}"
.
이 질문은 THIS 와 비슷 합니다.
이를 해결하기 위해 다음을 수행 할 수 있습니다.
DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"
echo "$DirPath"
내 친구가 말했듯이 이것이 가능합니다.
basename `dirname "/from/here/to/there.txt"`
경로의 일부를 얻으려면 다음을 수행 할 수 있습니다.
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
질문에 대한 최고의 답변은 절대적으로 정확합니다. 긴 경로 중간에 필요한 디렉토리가있는보다 일반적인 경우이 접근 방식은 코드를 읽기 어렵게 만듭니다. 예 :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"
이 경우 다음을 사용할 수 있습니다.
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS