/path/to/file 분할

/path/to/file 분할

파일에 대한 명시적인 경로가 있습니다.

/aaa/bbb/ccc/ddd/eee/fff.txt

cd /aaa/bbb에 대한 작업을 수행 해야 합니다 ccc/ddd/eee/fff.txt.

나는 첫 번째 요점을 이해합니다.

df_test=/aaa/bbb/ccc/ddd/eee/fff.txt
cd $( echo ${df_test} | awk -F/ '{print "/"$2"/"$3}' )

그렇다면 경로의 처음 두 단계를 잘라내고 나머지는 어떻게 작업합니까? 또한 이러한 파일이 얼마나 깊은지 미리 알 수 없습니다. 내가 가질 수도

/aaa/bbb/ccc/ddd.txt
/aaa/bbb/ccc/ddd/eee/fff.txt
/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/iii.txt

나는 디렉토리를 /aaa/bbb로 변경하고 나머지 상대 경로에 대해 작업해야 했습니다.

답변1

표준 쉘에서:

$ path=/aaa/bbb/ccc/ddd/eee/fff.txt
$ tail="${path#/*/*/}"
$ head="${path%/$tail}"
$ echo "$head" "$tail"
/aaa/bbb ccc/ddd/eee/fff.txt

"${path#/*/*/}"path/*/*/예. 하지만 (가장 짧은) 선행 부분 , 즉 후행 부분 과 일치하는 값을 제거합니다 . 그런 다음 슬래시를 "${path%/$tail}"사용하여 꼬리를 제거합니다.path

경로에 구성요소가 충분하지 않으면 손상된 결과가 발생하므로 이를 먼저 확인하는 것이 좋습니다.

또는 Bash에서는 정규식 일치를 사용 [[ .. ]]하고 일치하는 조각을 선택할 수 있습니다.

$ if [[ $path =~ (/[^/]+/[^/]+)/(.*) ]]; then 
    echo "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi 
/aaa/bbb ccc/ddd/eee/fff.txt

[[ ... ]]if따라서 조건에 따라 경로에 충분한 구성 요소가 있는지 확인하기 위해 여기에서 사용하기 쉽습니다 .

답변2

나는 개인적으로 cut이것을 좋아한다:

$ echo "/aaa/bbb/ccc/ddd/eee/fff.txt" | cut -d'/' -f4-
ccc/ddd/eee/fff.txt

-f해결하려는 디렉터리 트리의 깊이에 맞게 매개변수를 조정하기 만 하면 됩니다 .

다음을 사용하여 처음 두 필드를 제거하는 방법을 보여줍니다 awk.

$ echo "/aaa/bbb/ccc/ddd/eee/fff.txt" | awk -F'/' -v OFS='/' '{$1=$2=$3=""; print}' | sed 's#///##'
ccc/ddd/eee/fff.txt

답변3

접두사가 정적이므로 매개변수 확장을 사용하여 제거할 수 있습니다.

df_test=/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/iii.txt
cd /aaa/bbb
operate=${df_test#/aaa/bbb}
echo Operating on "$operate"

관련 정보