web-dev-qa-db-ja.com

どのようにbashで指定されたパスのルートディレクトリを取得するには?

私のスクリプト:

    #!/usr/bin/env bash
    PATH=/home/user/example/foo/bar
    mkdir -p /tmp/backup$PATH

そして今、「$ PATH」の最初のフォルダを取得したい:/ home /

    cd /tmp/backup
    rm -rf ./home/
    cd - > /dev/null

上記の例のように最初のフォルダーを常に検出するにはどうすればよいですか? 「dirname $ PATH」は単に「/ home/user/example/foo /」を返します。

前もって感謝します! :)

14
user2966991

私は解決策を見つけました:

    #/usr/bin/env bash
    DIRECTORY="/home/user/example/foo/bar"
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
    echo "#$BASE_DIRECTORY#";

これは常に最初のディレクトリを返します。この例では、以下を返します。

    #home#

Awkでのアイデアを@condorwasabiに感謝します! :)

24
user2966991

PATHが常に絶対形式である場合、次のようなトリックを実行できます

ROOT=${PATH#/} ROOT=/${ROOT%%/*}

または

IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}

ただし、実際に意図しない限り、バイナリファイルの検索ディレクトリが変更されるため、他の変数を使用し、PATHを使用しない方がよいことも付け加えておきます。

また、readlink -fまたはreadlink -mを使用してパスを絶対形式に変換することもできます。

ABS=$(readlink -m "$PATH")

私の関数 getabspath を参照することもできます。

6
konsolebox

次のawkコマンドを試すことができます。

 basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')

この時点で、basedirectoryは文字列homeになります。次に、次のように記述します。

rm -rf ./"$basedirectory"/
3
condorwasabi

最初の火力を取得するには:

path=/home/user/example/foo/bar
mkdir -p "/tmp/backup$path"
cd /tmp/backup
arr=( */ )
echo "${arr[0]}"

PS:スクリプトでPATH変数を使用しないでください。デフォルトのPATHを上書きし、スクリプトは多くのシステムユーティリティを実行できなくなります

編集:おそらくこれはあなたのために働くはずです:

IFS=/ && set -- $path; echo "$2"
home
1
anubhava

純粋なbash:

DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"

正規表現を簡単に調整できます。

0
Thomazella