Как объединить две строки для построения полного пути
Я пытаюсь написать bash script. В этом script я хочу, чтобы пользователь вводил путь к каталогу. Затем я хочу добавить некоторые строки в конце этой строки и построить путь к некоторым подкаталогам.
Например, пользователь вводит такую строку:
/home/user1/MyFolder
Теперь я хочу создать 2 подкаталога в этом каталоге и скопировать туда некоторые файлы.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Как я могу это сделать?
Ответы
Ответ 1
Стандарт POSIX предусматривает, что несколько /
рассматриваются как один /
в имени файла. таким образом
//dir///subdir////file
совпадает с /dir/subdir/file
.
Как таковая конкатенация двух строк для построения полного пути проста:
full_path="$part1/$part2"
Ответ 2
#!/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
Ответ 3
Не будет ли просто конкатенировать часть вашего пути, что вы хотите?
$ base="/home/user1/MyFolder"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFoldersubFold1
вы можете при необходимости создать папки/каталоги.
Ответ 4
Следующий script связывает несколько (относительных/абсолютных) путей (BASEPATH) с относительным путем (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 заканчиваться на нескольких слэшах (что, вероятно, бессмысленно). Без расширенного глобуса вы можете просто использовать:
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
Ответ 5
#!/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]"