113

私はbashスクリプトを書こうとしています。このスクリプトでは、ユーザーにディレクトリのパスを入力してもらいます。次に、この文字列の末尾にいくつかの文字列を追加して、いくつかのサブディレクトリへのパスを作成します。たとえば、ユーザーが次のような文字列を入力するとします。

/home/user1/MyFolder

このディレクトリに 2 つのサブディレクトリを作成し、そこにいくつかのファイルをコピーします。

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

これどうやってするの?

4

7 に答える 7

164

POSIX 標準では、ファイル名で複数/を単一として扱うことが義務付けられています。/したがって //dir///subdir////file、 と同じ/dir/subdir/fileです。

そのため、2 つの文字列を連結して完全なパスを作成するのは、次のように簡単です。

full_path="$part1/$part2"
于 2014-06-03T22:31:02.383 に答える
44
#!/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の呼び出しに a を追加しますread

read -e -p "Enter a directory: " BASEPATH
于 2012-06-27T12:40:16.517 に答える
20

パスの一部を連結するだけでは、目的が達成されませんか?

$ base="/home/user1/MyFolder/"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFolder/subFold1

その後、必要に応じてフォルダ/ディレクトリを作成できます。

/ で始まるパスはルート ディレクトリと混同される可能性があるため、1 つの規則として、ディレクトリ パスを/(たとえば) で終了します。/home/パスに二重スラッシュ ( //) が使用されている場合でも、それは正しいです。ただし、どちらの変数にもスラッシュが使用されていない場合は、正しくありません (例: /home/user1/MyFoldersubFold1)。

于 2012-06-27T12:38:38.490 に答える
5

次のスクリプトは、複数の (相対/絶対) パス (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
于 2017-01-03T22:34:14.657 に答える
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 "$@"
于 2012-06-27T13:04:32.840 に答える