2011-10-27 109 views
2

這是針對bash安裝腳本的。腳本foo.sh以「DIRECTORY」作爲參數。說,有一個目錄<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3和另一個目錄<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3Unix「查找」命令用法

腳本:foo.sh簡要介紹。

DIR='find $HOME -type d -name $1 | head 1' 
if [ DIR is set to a directory ] 
then 
    rm -rf $DIR 
fi 
exit 0 

用法:foo.sh TEST_3

現在從腳本,只有<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3可以被刪除。要刪除<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3,我需要在我的find命令中使用reg exp來精細調整remove以解決目錄衝突。

修改了上面的腳本的找兼職如下

DIR='find $HOME -type d -regexp $1 | head 1' 

新用法:foo.sh TEST_2B/TEST_3

但「查找」命令無法得到DIR設置爲<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3和結果,而不是返回空& DIR是空的,我永遠不會刪除<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

如何更改腳本,以便找到可以交流只是目錄名稱,以及目錄的路徑也沒有問題。事實上,一些用戶可能會給部分目錄路徑作爲參數「foo.sh」。我希望「foo.sh」能夠工作,即使在這種情況下也是如此

+1

請發佈bash腳本的源代碼。我寫了大量相當初級的,儘管長的腳本。沒有什麼可以迴應你的論點。 – octopusgrabbus

回答

0

難道這不按預期工作嗎?

find $HOME -type d -name $1 -exec echo {} ';' -exec rm -rf {} ';' 

它會抱怨刪除處理目錄,但toher比一些標準錯誤輸出它的確定...

可以OFC變「-name」爲「-regexp」如你所說,但如果你想要更復雜的東西,你可以創建特殊的腳本來調用「-exec」

編輯: 我大概瞭解你第一次錯誤(但不會刪除任何東西,它可能有助於某人) - 你想刪除只有TEST_3目錄中的一個(你怎麼選擇哪一個?首先通過find找到? - 這看起來很奇怪),仍然如我在之前的建議OU的段落,您可以提供skript到-exec將採取一切決策的護理)

+0

憑藉「查找」輸出,使用「foo.sh TEST_3」,總是將<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3刪除。如果我適當地更改我的「查找」參數,以支持部分路徑,那麼「foo.sh TEST_2B/TEST_3」應該刪除TEST_2B/TEST_3 – Mike

2

你可以嘗試:

if [[ "$1" == */* ]]; then 
    EXPR="-path *$1" 
else 
    EXPR="-name $1" 
fi 
DIR=$(find $HOME -type d $EXPR | head -1) 

像「TEST_3」一個簡單的名稱將轉化爲find -name TEST_3但有一個名字如「ST_2/TEST_3」的斜線將轉化爲find -path *ST_2/TEST3。這將處理(部分)目錄名稱。

+0

我在這裏找到問題。我認爲「發現」有部分路徑問題。對於前者,找到$(HOME)-path * ST_2B/TEST_3,但找到$(HOME) - 路徑TEST_2B/TEST_3,不會產生任何結果。奇怪。我也必須支持部分路徑,用「查找」解決路徑,然後將其刪除。 – Mike

+0

@Mike:查找沒有問題,只有您的期望是錯誤的。 '-path'將_complete_路徑與給定模式進行比較。因此,將'xyz/TEST_2B/TEST_3'與您的參數'TEST_2B/TEST3'進行比較,這顯然是不匹配的。與'*/TEST_2B/TEST_3'相比,它是一場比賽。關於「部分匹配」:如果我的回答不是你想要的,請通過編輯在問題中說明這一點。答案中的長時間討論令人不悅,請參閱常見問題解答。 –

+0

隨着你的第二個解釋,我得到了什麼 - 路徑期望和它會爲我工作。非常感謝 – Mike