如何连接两个字符串以构建完整的路径

时间:2012-06-27 12:34:17

标签: linux bash

我正在尝试编写一个bash脚本。在此脚本中,我希望用户输入目录的路径。然后我想在这个字符串的末尾添加一些字符串,并构建一些子目录的路径。 例如,假设用户输入如下字符串:

/home/user1/MyFolder

现在我想在这个目录中创建2个子目录并在那里复制一些文件。

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

我该怎么做?

7 个答案:

答案 0 :(得分:100)

POSIX标准要求将多个/视为文件名中的单个/。从而 //dir///subdir////file/dir/subdir/file相同。

因此,连接两个字符串以构建完整路径是一个简单的:

full_path="$part1/$part2"

答案 1 :(得分:33)

#!/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的调用中添加read

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

答案 2 :(得分:13)

不会简单地连接你的路径部分来实现你想要的东西吗?

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

然后您可以根据需要创建文件夹/目录。

答案 3 :(得分: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 extglob只需要允许BASEPATH以多个斜杠结束(这可能是无意义的)。如果没有扩展的全局,你可以使用:

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

答案 4 :(得分: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 "$@"

答案 5 :(得分:0)

这应该适用于空目录(您可能需要检查第二个字符串是否以/开头,应该将其视为绝对路径吗?):

#!/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

参考:Shell Parameter Expansion

答案 6 :(得分:0)

我正在处理我的shell脚本,该脚本需要像您一样做一些路径连接工作。

问题是,两条路径都像

/data/foo/bar

/data/foo/bar/ 

有效。

如果我想向该路径附加文件,例如

/data/foo/bar/myfile

shell中没有本地方法(如python中的os.path.join())来处理这种情况。

但是我确实找到了窍门

例如,基本路径存储在shell变量中

BASE=~/mydir

您要加入的最后一个文件名是

FILE=myfile

然后您可以像这样分配新路径

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

然后您会得到

$ echo $NEW_PATH

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

原因很简单,如果需要,“ realpath”命令将始终为您修剪终止斜线