web-dev-qa-db-ja.com

$ PWDが特定のパスのサブディレクトリであるかどうかを確認する方法

例えば。 $PWDは/ homeのサブディレクトリです。つまり、ある文字列が別の文字列で始まるかどうかを確認するために、bash文字列操作を検索しています。

26
Tobias Kienzler

ディレクトリが別のディレクトリのサブディレクトリであるかどうかを確実にテストする場合は、文字列のプレフィックスチェックだけでは不十分です。 Gillesの回答は、このテストを適切に行う方法を詳しく説明しています。

しかし、単純な文字列のプレフィックスチェックが必要な場合(おそらく、パスを既に正規化しているのでしょうか?)、これは良い方法です。

test "${PWD##/home/}" != "${PWD}"

$PWDは「/ home /」で始まり、左側で削除されます。つまり、右側と一致しないため、「!=」はtrueを返します。

28
Jander

任意のボーンスタイルシェルで、文字列が別の文字のプレフィックスであるかどうかをテストするには:

case $PWD/ in
  /home/*) echo "home sweet home";;
  *) echo "away from home";;
esac

同じ原則が、サフィックステストまたはサブストリングテストでも機能します。 case構文では、ファイル名とは異なり、*/または最初の.を含むすべての文字に一致することに注意してください。

[[ … ]]構文を実装するシェル(bash、ksh、zshなど)では、文字列をパターンと照合するために使用できます。 ([コマンドは文字列が等しいかどうかのみテストできることに注意してください。)

if [[ $PWD/ = /home/* ]]; then …

現在のディレクトリが/homeの下にあるかどうかを具体的にテストする場合、シンボリックリンクのため、単純な部分文字列テストでは十分ではありません。

/homeが独自のファイルシステムである場合は、現在のディレクトリ(.)がそのファイルシステム上にあるかどうかをテストします。

if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
  echo 'The current directory is on the /home filesystem'
fi

NetBSD、OpenBSD、またはGNU(つまりLinux)readlinkを使用している場合は、readlink -fを使用してパスからシンボリックリンクを削除できます。

case $(readlink -f .)/ in $(readlink -f /home)/*) …

それ以外の場合は、pwdを使用して現在のディレクトリを表示できます。ただし、シェルがcdコマンドを追跡し、「実際の」場所ではなくディレクトリに到達するために使用した名前を保持している場合は、組み込みのシェルを使用しないように注意する必要があります。

case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
  "$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …

原油バージョン:

[ ${PWD:0:6} = "/home/" ]

最初に文字を数える必要があり、/home/$1のような一般的なものに置き換えることができないという欠点があります。

編集(@Michaelに感謝)汎化を$VARと比較して使用できる

[ "${PWD:0:${#VAR}}" = $VAR ]
8
Tobias Kienzler

私は質問をあまり理解していませんが、$ PWDの親を見つけるには、_dirname $PWD_を実行します。親の親を見つけるには、dirname $(dirname $PWD)などを実行します...

2
tshepang

awkの使用:

echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
1
dogbane

うーん、残念です[にはテストするオプションがありませんSTRING1 starts with STRING2 状態。

echo $PWD | grep '^$VAR'ですが、VARに特殊記号が含まれていると、興味深い方法で失敗する可能性があります。

awkindex関数がトリックを実行できるはずです。しかし、これはすべて、テストするのが簡単なほど重すぎるようです。

0
alex

パスの検索部分が見つかった場合、変数を「空」にします。

[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
0
user4177