Bash에서 디렉토리의 부모 가져오기
다음과 같은 파일 경로가 있는 경우...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
부모 디렉토리가 되도록 문자열을 변경하려면 어떻게 해야 합니까?
예.
/home/smith/Desktop
/home/smith/Desktop/
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
후행 슬래시가 있는 경우에도 효과가 있습니다.
부모 디렉토리는 닷 파일명을 추가하는 것만으로 알 수 있습니다.
/home/smith/Desktop/Test/.. # unresolved path
단, 해결된 경로(도트 경로 구성 요소가 없는 절대 경로)가 필요합니다.
/home/smith/Desktop # resolved path
가 사용하는 상위 답변의 문제dirname도트 패스를 입력했을 때는, 이러한 패스가 기능하지 않는 것을 의미합니다.
$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/.. # not fully resolved
이것이 더 강력합니다.
dir=/home/smith/Desktop/Test
parentdir=$(builtin cd $dir; pwd)
먹일 수 있다/home/smith/Desktop/Test/..다음과 같은 복잡한 경로도 있습니다.
$ dir=~/Library/../Desktop/../..
$ parentdir=$(builtin cd $dir; pwd)
$ echo $parentdir
/Users # the fully resolved path!
주의: 사용방법builtin사용자 정의 기능의 변형을 보증합니다.cd는 호출되지만 출력이 없는 기본 유틸리티 형식입니다.
그냥 사용하다echo $(cd ../ && pwd)부모 dir 를 검출하는 디렉토리에서 작업하는 동안.이 체인에는 후행 슬래시가 없다는 이점도 있습니다.
...하지만 "여기에 보이는" 것은 부서졌다.해결 방법은 다음과 같습니다.
> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
다른 답변에 대한 동기 부여
아주 짧고, 명확하고, 보장된 코드가 좋아요.외부 프로그램을 실행하지 않으면 보너스 포인트로 대량의 엔트리를 처리해야 하는 날이기 때문에 매우 빠릅니다.
원칙
당신이 무엇을 가지고 있고 무엇을 원하는지 확실하지 않기 때문에, 어쨌든 제안합니다.
보증서가 있으면 매우 짧은 코드로 할 수 있습니다.bash 텍스트 치환 기능을 사용하여 마지막 슬래시 등을 잘라내는 것이 좋습니다.
원래 질문의 간단한 사례에서 더 복잡한 사례로 답하십시오.
경로가 슬래시 없이 종료되는 것이 보증되는 경우(입력 및 출력)
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
경로가 정확히 하나의 슬래시로 끝나는 경우(입력 및 출력)
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
입력 경로가 0 또는 1개의 슬래시(더 이상)로 끝날 수 있고 출력 경로를 슬래시 없이 끝내려면
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/
do
P_ENDNOSLASH="${P%/}" ; echo "${P_ENDNOSLASH%/*}"
done
/home/smith/Desktop
/home/smith/Desktop
입력 경로에 많은 외부 슬래시가 있을 수 있으며 슬래시 없이 출력 경로를 종료하려는 경우
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/ \
/home/smith///Desktop////Test//
do
P_NODUPSLASH="${P//\/*(\/)/\/}"
P_ENDNOSLASH="${P_NODUPSLASH%%/}"
echo "${P_ENDNOSLASH%/*}";
done
/home/smith/Desktop
/home/smith/Desktop
/home/smith/Desktop
부모 디렉토리의 이름만 필요한 경우:
parent_dir_name=$(basename $(dirname $PWD))
한다면/home/smith/Desktop/Test/../원하는 것은 다음과 같습니다.
dirname 'path/to/child/dir'
여기 보이는 것처럼
절대 경로가 필요한지 여부에 따라 추가 단계를 수행할 수 있습니다.
child='/home/smith/Desktop/Test/'
parent=$(dirname "$child")
abs_parent=$(realpath "$parent")
다음을 사용합니다.export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")"네 번째 부모 디렉토리를 원하는 경우
export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")"세 번째 부모 디렉토리를 원하는 경우
export MYVAR="$(dirname "$(dirname $PWD)")"두 번째 부모 디렉토리를 원하는 경우
못생겼지만 능률적인
function Parentdir()
{
local lookFor_ parent_ switch_ i_
lookFor_="$1"
#if it is not a file, we need the grand parent
[ -f "$lookFor_" ] || switch_="/.."
#length of search string
i_="${#lookFor_}"
#remove string one by one until it make sens for the system
while [ "$i_" -ge 0 ] && [ ! -d "${lookFor_:0:$i_}" ];
do
let i_--
done
#get real path
parent_="$(realpath "${lookFor_:0:$i_}$switch_")"
#done
echo "
lookFor_: $1
{lookFor_:0:$i_}: ${lookFor_:0:$i_}
realpath {lookFor_:0:$i_}: $(realpath ${lookFor_:0:$i_})
parent_: $parent_
"
}
lookFor_: /home/Om Namah Shivaya
{lookFor_:0:6}: /home/
realpath {lookFor_:0:6}: /home
parent_: /home
lookFor_: /var/log
{lookFor_:0:8}: /var/log
realpath {lookFor_:0:8}: /UNIONFS/var/log
parent_: /UNIONFS/var
lookFor_: /var/log/
{lookFor_:0:9}: /var/log/
realpath {lookFor_:0:9}: /UNIONFS/var/log
parent_: /UNIONFS/var
lookFor_: /tmp//res.log/..
{lookFor_:0:6}: /tmp//
realpath {lookFor_:0:6}: /tmp
parent_: /
lookFor_: /media/sdc8/../sdc8/Debian_Master//a
{lookFor_:0:35}: /media/sdc8/../sdc8/Debian_Master//
realpath {lookFor_:0:35}: /media/sdc8/Debian_Master
parent_: /media/sdc8
lookFor_: /media/sdc8//Debian_Master/../Debian_Master/a
{lookFor_:0:44}: /media/sdc8//Debian_Master/../Debian_Master/
realpath {lookFor_:0:44}: /media/sdc8/Debian_Master
parent_: /media/sdc8
lookFor_: /media/sdc8/Debian_Master/../Debian_Master/For_Debian
{lookFor_:0:53}: /media/sdc8/Debian_Master/../Debian_Master/For_Debian
realpath {lookFor_:0:53}: /media/sdc8/Debian_Master/For_Debian
parent_: /media/sdc8/Debian_Master
lookFor_: /tmp/../res.log
{lookFor_:0:8}: /tmp/../
realpath {lookFor_:0:8}: /
parent_: /
아이디어/코멘트 Charles Duffy에서 시작 - 2014년 12월 17일 5:32에 Bash 스크립트에서 현재 디렉토리 이름 가져오기(풀 경로 없음) 항목에 대해
#!/bin/bash
#INFO : https://stackoverflow.com/questions/1371261/get-current-directory-name-without-full-path-in-a-bash-script
# comment : by Charles Duffy - Dec 17 '14 at 5:32
# at the beginning :
declare -a dirName[]
function getDirNames(){
dirNr="$( IFS=/ read -r -a dirs <<<"${dirTree}"; printf '%s\n' "$((${#dirs[@]} - 1))" )"
for(( cnt=0 ; cnt < ${dirNr} ; cnt++))
do
dirName[$cnt]="$( IFS=/ read -r -a dirs <<<"$PWD"; printf '%s\n' "${dirs[${#dirs[@]} - $(( $cnt+1))]}" )"
#information – feedback
echo "$cnt : ${dirName[$cnt]}"
done
}
dirTree=$PWD;
getDirNames;
로든 특정 하는 데 이 있는 경우 수 .nth_path=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd ../../../ && pwd)
이것은 상위 폴더로 이동합니다.
cd ../
언급URL : https://stackoverflow.com/questions/8426058/getting-the-parent-of-a-directory-in-bash
'programing' 카테고리의 다른 글
| 관찰 가능한 수집 <> 대리스트 <> (0) | 2023.04.20 |
|---|---|
| WPF의 심플한(내 생각에) 수평선? (0) | 2023.04.20 |
| 이미지 저장 - SQL DB vs Azure Blob 스토리지 (0) | 2023.04.20 |
| 표시된 뷰 컨트롤러의 대화형 삭제 사용 안 함 (0) | 2023.04.20 |
| Azure AD의 "Request API permissions"에서 "Application permissions"가 비활성화되어 있는 이유는 무엇입니까? (0) | 2023.04.20 |