次のようなファイルパスがある場合...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
親ディレクトリになるように文字列を変更するにはどうすればよいですか?
例えば
/home/smith/Desktop
/home/smith/Desktop/
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
末尾にスラッシュがある場合にも機能します。
echo $(cd ../ && pwd)
親ディレクトリを調べたいディレクトリで作業中に使用するだけです。このチェーンには、末尾のスラッシュがないという追加の利点もあります。
...しかし、「ここで見える」ものは壊れています。修正は次のとおりです。
> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
私は非常に短く、明確で、保証されたコードが好きです。膨大な数のエントリを処理する必要がある日から、外部プログラムを実行しない場合のボーナス ポイントは、著しく高速になります。
どのような保証があり、どのような保証が必要なのかわからないので、とにかく提供します。
保証がある場合は、非常に短いコードで実行できます。アイデアは、bash のテキスト置換機能を使用して、最後のスラッシュとそれに続くものを切り取ることです。
元の質問の単純なケースからより複雑なケースまで回答します。
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/
do
P_ENDNOSLASH="${P%/}" ; echo "${P_ENDNOSLASH%/*}"
done
/home/smith/Desktop
/home/smith/Desktop
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/ \
/home/smith///Desktop////Test//
do
P_NODUPSLASH="${P//\/*(\/)/\/}"
P_ENDNOSLASH="${P_NODUPSLASH%%/}"
echo "${P_ENDNOSLASH%/*}";
done
/home/smith/Desktop
/home/smith/Desktop
/home/smith/Desktop
これは親フォルダーに移動します
cd ../