我正在尝试编写一个bash脚本。在这个脚本中,我希望用户输入一个目录的路径。然后我想在这个字符串的末尾附加一些字符串并构建一些子目录的路径。 例如,假设用户进入一个像这样的字符串:如何连接两个字符串以构建完整路径
/home/user1/MyFolder
现在我想的目录下建立2个子目录和复制一些文件存在。
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
我怎样才能做到这一点?
我正在尝试编写一个bash脚本。在这个脚本中,我希望用户输入一个目录的路径。然后我想在这个字符串的末尾附加一些字符串并构建一些子目录的路径。 例如,假设用户进入一个像这样的字符串:如何连接两个字符串以构建完整路径
/home/user1/MyFolder
现在我想的目录下建立2个子目录和复制一些文件存在。
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
我怎样才能做到这一点?
不会简单地连接你的路径的一部分完成你想要的?
$ base="/home/user1/MyFolder"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFoldersubFold1
然后,您可以根据需要创建文件夹/目录。
#!/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
如果你想要让你得到完成,这一切,将呼叫添加-e
到read
成使用输入:
read -e -p "Enter a directory: " BASEPATH
不幸的是,这在BASEPATH为空时不起作用。我需要的是类似的东西,只有当它还没有结束斜线并且不为空时才会添加/。因此,当它在合法的文件名字符上结束时。 –
#!/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 "[email protected]"
多个/
正在治疗的POSIX标准规定作为文件名中的单个/
。因此, //dir///subdir////file
与/dir/subdir/file
相同。
这样串联一个两个字符串建立一个完整路径是一个简单的为:
full_path="$part1/$part2"
除非$ part1可以是空字符串。 –
@TuureLaurinolli我不明白你来自哪里。上面的连接仍然会导致有效的路径。路径可能不存在,但它仍然有效。例如。 '“”+“/”+“文件”'给出'“/ Documents”'。 – Dunes
如果零件本身是相对路径,且零件1可能为空,则结果可能会从相对路径转为绝对路径。 –
下面的脚本catenates若干(相对/绝对)路径(基本路径)与相对路径(SUBDIR):
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以多个斜线结束(这可能是无稽之谈)。如果没有扩展globing你可以使用:
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
你尝试过这么远吗?另外,您的问题是从用户那里获得输入的一部分,另一部分是关于构建路径的部分?或者只是路径? – Levon
只是创建路径。 – Hakim