2016-09-12 43 views
2

具有這種結構:Shell腳本:需要使用一個文件夾不是當前目錄

/dir1/dir2/dir3/dir4/my_script.sh

在一個點在我的腳本需要將dir3的完整路徑存儲到變量中。 我知道這個作品:

CURRENT=`pwd` 

但是,我怎樣才能存儲前一個?

警告:我已經搜索了類似的問題,但都包括更改當前目錄,這是我想避免的。

編輯:我的意思是,因爲我跑my_script.sh,當前目錄是/ DIR1/DIR2/DIR3/dir4/ 我想在一個變量只存儲:/ DIR1/DIR2/dir3/

+0

你的意思是像'$ OLDPWD'? – redneb

+0

你的意思是父目錄嗎? – vmonteco

回答

2

如何使用dirname

dirname $(pwd) 
/dir1/dir2/dir3 

要存儲在變量一級目錄值:

x=$(dirname $(pwd)) 
echo $x 
/dir1/dir2/dir3 
+0

非常感謝! 這是最快的方式(比參與字符串操作更好)。 – Joster

+0

@joster很高興幫助。 –

+3

@Joster - 我很好奇,你爲什麼認爲這個解決方案比字符串操作更好?我可以想出爲什麼字符串操作會更好的多種原因,但是我在這個方向上很短暫。 (榮譽到PS的一個快速,準確的答覆雖然!) – ghoti

2

您可以使用bash字符串處理得到任何完整路徑的父目錄的父目錄路徑:

$> pwd 
/dir1/dir2/dir3/dir4 
$> echo "${PWD%/[^/]*}" 
/dir1/dir2/dir3 

%/[^/]*刪除最後一個匹配模式/*$PWD這是當前的工作目錄。

+1

'echo「$ {PWD%/ [^ /] */[^ /] *}「'不匹配'dirname $ PWD' ... – Sundeep

+1

是的,正確的糾正,我得到了父母而不是父母。 – anubhava

+1

也是如此,因爲使用單個'%','echo「$ {PWD%*/*}」'也可以工作 – Sundeep

1

,而不是做任何字符串操作或在子shell啓動的命令,你可以指任何目錄的父目錄..本地或者,如果你能信任$PWD變量,你可以使用$PWD/..

當然,這只是讓你使用父目錄,它不會給你父目錄的名稱。爲此,你已經有了幾個可用的替代品。再一次,請繼續閱讀。

在bash中cd內建命令有兩個選項,-P告訴cd使用的物理目錄結構遍歷,因爲它解決符號鏈接的目錄結構,並-L哪些手冊頁這樣說:

        the -L option forces symbolic links 
     to be followed by resolving the link after processing instances 
     of .. in dir. If .. appears in dir, it is processed by removing 
     the immediately previous pathname component from dir, back to a 
     slash or the beginning of dir. 

所以......雖然你可能是完美的罰款下列要求:

parentdir="$(cd ..; pwd)" 

你可以用,因此得到的父目錄:

parentdir="$(cd -L ..; pwd)" 

注意的是,雖然這確實涉及一個目錄的變化,這種變化實際上是一個子shell($(...))內,因此它不會影響你的腳本。

請注意,我說的「有效」,因爲嚴格來說,$(...)cdpwd是內置所有打壞,所以你實際上並不產生新的炮彈。

相關問題