我正在尝试编写一个bash脚本。在此脚本中,我希望用户输入目录的路径。然后我想在这个字符串的末尾添加一些字符串,并构建一些子目录的路径。 例如,假设用户输入如下字符串:
/home/user1/MyFolder
现在我想在这个目录中创建2个子目录并在那里复制一些文件。
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
我该怎么做?
答案 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
答案 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”命令将始终为您修剪终止斜线