281

次のようなファイルパスがある場合...

/home/smith/Desktop/Test
/home/smith/Desktop/Test/

親ディレクトリになるように文字列を変更するにはどうすればよいですか?

例えば

/home/smith/Desktop
/home/smith/Desktop/
4

13 に答える 13

439
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"

末尾にスラッシュがある場合にも機能します。

于 2011-12-08T04:19:54.313 に答える
27

echo $(cd ../ && pwd)親ディレクトリを調べたいディレクトリで作業中に使用するだけです。このチェーンには、末尾のスラッシュがないという追加の利点もあります。

于 2016-12-28T11:22:45.750 に答える
21

...しかし、「ここで見える」ものは壊れています。修正は次のとおりです。

> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
于 2014-12-09T09:01:49.220 に答える
13

別の回答の動機

私は非常に短く、明確で、保証されたコードが好きです。膨大な数のエントリを処理する必要がある日から、外部プログラムを実行しない場合のボーナス ポイントは、著しく高速になります。

原理

どのような保証があり、どのような保証が必要なのかわからないので、とにかく提供します。

保証がある場合は、非常に短いコードで実行できます。アイデアは、bash のテキスト置換機能を使用して、最後のスラッシュとそれに続くものを切り取ることです。

元の質問の単純なケースからより複雑なケースまで回答します。

パスがスラッシュなしで終了することが保証されている場合 (インとアウト)

P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop

パスが 1 つのスラッシュ (インとアウト) で終わることが保証されている場合

P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/

入力パスが 0 個または 1 個のスラッシュ (それ以上ではない) で終わる可能性があり、出力パスをスラッシュなしで終了させたい場合

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
于 2018-07-15T10:26:21.300 に答える
9

あなた/home/smith/Desktop/Test/../が望むものなら:

dirname 'path/to/child/dir'

ここに見られるように。

于 2011-12-08T04:15:53.850 に答える
-2

これは親フォルダーに移動します

cd ../
于 2020-11-04T14:34:03.047 に答える