2014-07-08 2 views
6

내 스크립트를How-Bash에서 주어진 경로의 루트 디렉토리를 얻으려면?

#!/usr/bin/env bash 
    PATH=/home/user/example/foo/bar 
    mkdir -p /tmp/backup$PATH 

그리고 지금은 "$ 경로"의 첫 번째 폴더를 얻으려면 :/홈/

cd /tmp/backup 
    rm -rf ./home/ 
    cd - > /dev/null 

가 어떻게 항상 위의 예와 같이 첫 번째 폴더를 검색 할 수 있습니다? "dirname $ PATH"는 "/ home/user/example/foo /"를 반환합니다.

미리 감사드립니다. :) 항상 절대 양식을 가지고

답변

12

:

#/usr/bin/env bash 
    DIRECTORY="/home/user/example/foo/bar" 
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2) 
    echo "#$BASE_DIRECTORY#"; 

다음 은 당신이 쓰는 문자열 집에있을 것입니다이 시점 basedirectory에서

basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}') 

이 awk 명령을 시도 할 수 있습니다 이렇게하면 항상 첫 번째 디렉토리가 반환됩니다. 이 예에서는 다음과 같이 반환됩니다.

#home# 

awk의 아이디어에 대한 @condorwasabi에게 감사드립니다! :)

+2

경로가 상대 경로이고'dir1/in/dir2'처럼 보이는 경우'-f2' 대신'-f1' 필드를 사용해야합니다. – dmeu

1

PATH 경우 나 또한 다른 변수 및하지로를 사용하는 것이 좋습니다 그 그에 추가해야하지만 당신은

ROOT=${PATH#/} ROOT=/${ROOT%%/*} 

또는

IFS=/ read -ra T <<< "$PATH" 
ROOT=/${T[1]} 

같은 트릭을 할 수 PATH을 사용하면 검색 디렉토리에서 바이너리 파일을 변경할 수 있습니다.

또한 당신은 readlink -f 또는 readlink -m을 통해 절대 형태로 경로를 변환하도록 선택할 수 있습니다 :

ABS=$(readlink -m "$PATH") 

또한 내 기능 getabspath를 참조 할 수 있습니다.

path=/home/user/example/foo/bar 
mkdir -p "/tmp/backup$path" 
cd /tmp/backup 
arr=(*/) 
echo "${arr[0]}" 

PS :이 기본 경로를 overrider을 받고 스크립트 많은 시스템 유틸리티

을 실행할 수 없습니다 귀하의 스크립트에서 PATH 변수를 사용하지 마십시오
+0

죄송하지만,이 점을 이해하지 못합니다. 감사합니다. – user2966991

+0

음, 너무 나쁘다. 행운을 빕니다 :) – konsolebox

0

첫 번째 firectory를 얻으려면

편집 :은 아마이 당신을 위해 작동합니다 :

IFS=/ && set -- $path; echo "$2" 
home 
+0

나는 사용자가 그것을 집에서 꺼내고 싶어한다고 생각합니다. – anishsane

+0

흠'내가 어떻게 위의 예와 같이 첫 번째 폴더를 항상 감지 할 수 있습니까? '는 분명하지 않습니다. 나는 OP가'/ tmp/backup' 경로에서 첫 번째 디렉토리를 얻으려는 것으로 해석했다. – anubhava

+0

나는'PATH' 변수에 대한 경고에 대해 & +1님께 감사의 뜻을 표하기 시작했습니다. :) 그 대답은 아마도 OP의 요구 사항을 만족시키지 못한다는 것을 깨달았습니다. – anishsane

2

당신에게 나는 해결책을 발견했습니다

rm -rf ./"$basedirectory"/ 
+0

괜찮은 것처럼 보이지만 작동하지 않습니다. $ based 디렉토리는 항상 비어 있습니다. 하지만 고마워! :) – user2966991

+2

당신이 해결책을 찾게되어 기쁘다. 어쨌든 당신이 옳았어요, 방금 스크립트를 편집했습니다. 나는 왜 {print $ 1}'을 썼는지 모르겠다. 나는 그것을 게시하기 전에 테스트를했다. 이제는 효과가 있습니다. – condorwasabi