Answers:
POSIX标准要求在文件名中将多个/
视为单个/
。因此
//dir///subdir////file
与相同/dir/subdir/file
。
因此,将两个字符串连接起来以构建完整路径很简单:
full_path="$part1/$part2"
"" + "/" + "Documents"
给"/Documents"
。
./
到前面。但是也许用户想要连接绝对路径。否则,它们可以简单地添加./
到前面以强制路径相对。另请注意,"$path1/./$path2"
与相同"$path1/$path2"
。
#!/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
不会简单地串联路径的一部分来完成您想要的?
$ base="/home/user1/MyFolder/"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFolder/subFold1
然后,您可以根据需要创建文件夹/目录。
一种约定是用/
(例如/home/
)结束目录路径,因为以/开头的路径可能与根目录混淆。如果//
在路径中使用双斜杠(),则它仍然是正确的。但是,如果在任何一个变量上都没有使用斜杠,那将是不正确的(例如/home/user1/MyFoldersubFold1
)。
/home/user1/MyFolder/subFold1
所以您需要内联new_path=$base/$subdir
。但是,如果给定的路径包含结尾的“ /”,您该怎么办?
newpath=$base/$subdir/
您可以在命令行上直接使用它
以下脚本用相对路径(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
仅需要允许基本路径,结束对多个斜线(这可能是无义)。如果没有扩展的问题,您可以使用:
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
我正在处理我的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”命令将始终为您修剪终止斜杠
#!/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 "$@"