두 문자열을 연결하여 완전한 경로를 만드는 방법


93

bash 스크립트를 작성하려고합니다. 이 스크립트에서 사용자가 디렉토리 경로를 입력하기를 원합니다. 그런 다음이 문자열 끝에 문자열을 추가하고 일부 하위 디렉터리에 대한 경로를 만들고 싶습니다. 예를 들어 사용자가 다음과 같은 문자열을 입력한다고 가정합니다.

/home/user1/MyFolder

이제이 디렉터리에 2 개의 하위 디렉터리를 만들고 여기에 일부 파일을 복사합니다.

/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2

어떻게 할 수 있습니까?


1
지금까지 뭐 해봤 어? 또한 사용자로부터 입력을받는 것에 대한 질문의 일부이고 경로 구축에 대한 다른 부분입니까? 아니면 그냥 경로?
Levon 2012-06-27

답변:


135

POSIX 표준 은 파일 이름에서 여러 개 /를 단일 /로 취급 하도록 요구합니다 . 이와 //dir///subdir////file동일하다 /dir/subdir/file.

전체 경로를 구축하기 위해 두 문자열을 연결하는 것은 다음과 같이 간단합니다.

full_path="$part1/$part2"

11
$ part1이 빈 문자열 일 수있는 경우는 예외입니다.
Tuure Laurinolli

1
@TuureLaurinolli 나는 당신이 어디에서 왔는지 이해하지 못합니다. 위의 연결은 여전히 ​​유효한 경로를 생성합니다. 경로가 존재하지 않을 수 있지만 여전히 유효합니다. 예. "" + "/" + "Documents"제공합니다 "/Documents".
Dunes

17
부품 자체가 상대 경로이고 part1이 비어 있으면 결과가 상대 경로에서 절대 경로로 바뀔 수 있습니다.
Tuure Laurinolli

2
@TuureLaurinolli 그러면 ./전면에 추가 할 수 있습니다 . 그러나 사용자 절대 경로를 연결 하고 싶을 수도 있습니다. 그렇지 않으면 단순히 ./앞쪽에 추가 하여 경로를 상대적으로 만들 수 있습니다. 또한주의 "$path1/./$path2"와 동일합니다 "$path1/$path2".
yyny

41
#!/bin/bash

read -p "Enter a directory: " BASEPATH

SUBFOLD1=${BASEPATH%%/}/subFold1
SUBFOLD2=${BASEPATH%%/}/subFold2

echo "I will create $SUBFOLD1 and $SUBFOLD2"

# mkdir -p $SUBFOLD1
# mkdir -p $SUBFOLD2

그리고 readline을 사용하여 완료 및 모든 것을 얻으려면 -e다음 호출에 a 를 추가하십시오 read.

read -e -p "Enter a directory: " BASEPATH

1
불행히도 BASEPATH가 비어 있으면 작동하지 않습니다. 내가 필요한 것은 이미 슬래시로 끝나지 않고 비어 있지 않을 때 / 만 추가하는 것입니다. 따라서 올바른 파일 이름 문자로 끝날 때.
Carlo Wood

17

단순히 경로의 일부를 연결하여 원하는 것을 달성하지 않습니까?

$ base="/home/user1/MyFolder/"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFolder/subFold1

그런 다음 필요에 따라 폴더 / 디렉토리를 생성 할 수 있습니다.

한 가지 규칙은 /로 시작하는 경로가 루트 디렉토리와 혼동 될 수 있으므로 디렉토리 경로를 /(예 :)로 끝내는 /home/것입니다. //경로에 이중 슬래시 ( )가 사용 된 경우에도 여전히 정확합니다. 그러나 두 변수에 슬래시를 사용하지 않으면 잘못된 것입니다 (예 :) /home/user1/MyFoldersubFold1.


3
이 메시지가 표시되는 이유 : Myscript.sh : 4 행 : / home / user1 / MyFolder / subFold1 : Is a directory
Hakim

2
경로에 /가 없습니다. 목표는 인라인 /home/user1/MyFolder/subFold1 이므로 인라인 이 필요합니다 new_path=$base/$subdir. 그러나 주어진 경로에 후행 '/'가 포함되면 어떻게합니까?
Thrasi

1
@Thrasi는 subdir 변수에 후행 '/'를 추가하거나 newpath=$base/$subdir/명령 줄에서 직접 재생할 수 있습니다
user12345

3
@ user12345, 예 ... 위의 솔루션이 여전히 올바르지 않습니다.
Thrasi 2017-10-26

5

다음 스크립트는 상대 경로 (SUBDIR)로 여러 (상대 / 절대) 경로 (BASEPATH)를 연결합니다.

shopt -s extglob
SUBDIR="subdir"
for BASEPATH in '' / base base/ base// /base /base/ /base//; do
  echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR"
done

그 결과는 다음과 같습니다.

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base/subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base/subdir

shopt -s extglobBASEPATH은 (넌센스 아마 인) 여러 슬래시에 종료 할 수 있도록에만 필요합니다. 확장 된 글 로빙없이 다음을 사용할 수 있습니다.

echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR

덜 깔끔하지만 여전히 작동합니다.

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base//subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base//subdir

1

나는 당신과 같은 경로 결합 작업을 수행 해야하는 쉘 스크립트로 작업하고있었습니다.

문제는 두 경로 모두

/data/foo/bar

/data/foo/bar/ 

유효합니다.

이 경로에 파일을 추가하려면

/data/foo/bar/myfile

그러한 상황을 처리하기위한 쉘에는 네이티브 메서드 (python의 os.path.join ()와 같은)가 없었습니다.

하지만 속임수를 찾았어요

예를 들어, 기본 경로는 쉘 변수에 저장되었습니다.

BASE=~/mydir

가입하고 싶은 마지막 파일 이름은

FILE=myfile

그런 다음 다음과 같이 새 경로를 할당 할 수 있습니다.

NEW_PATH=$(realpath ${BASE})/FILE

그리고 당신은 얻을 것이다

$ echo $NEW_PATH

/path/to/your/home/mydir/myfile

이유는 조용하고 간단합니다. "realpath"명령은 필요한 경우 항상 종료 슬래시를 잘라냅니다.


0
#!/usr/bin/env bash

mvFiles() {
    local -a files=( file1 file2 ... ) \
             subDirs=( subDir1 subDir2 ) \
             subDirs=( "${subDirs[@]/#/$baseDir/}" )

    mkdir -p "${subDirs[@]}" || return 1

    local x
    for x in "${subDirs[@]}"; do
        cp "${files[@]}" "$x"
    done
}



main() {
    local baseDir
    [[ -t 1 ]] && echo 'Enter a path:'
    read -re baseDir
    mvFiles "$baseDir"
}

main "$@"

0

이것은 빈 dir에서 작동합니다 (두 번째 문자열이 /절대 경로로 취급되어야하는 것으로 시작하는지 확인해야 할 수도 있습니다 .) :

#!/bin/bash

join_path() {
    echo "${1:+$1/}$2" | sed 's#//#/#g'
}

join_path "" a.bin
join_path "/data" a.bin
join_path "/data/" a.bin

산출:

a.bin
/data/a.bin
/data/a.bin

참조 : 쉘 매개 변수 확장

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.