Подтвердить что ты не робот

Как объединить две строки для построения полного пути

Я пытаюсь написать bash script. В этом script я хочу, чтобы пользователь вводил путь к каталогу. Затем я хочу добавить некоторые строки в конце этой строки и построить путь к некоторым подкаталогам. Например, пользователь вводит такую ​​строку:

/home/user1/MyFolder

Теперь я хочу создать 2 подкаталога в этом каталоге и скопировать туда некоторые файлы.

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

Как я могу это сделать?

4b9b3361

Ответ 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]"