2012-10-20 43 views
2

說我有這個文件夾結構:UNIX - 如何寫一個bash腳本來自動切換到下一首/上目錄

MainFolder 
    Folder1 
    Folder2 
    Folder3 
    ... 
    Folder200 

我想寫的是,如果我當前的內部文件夾2並執行一個腳本腳本,它會自動切換到列表中的下一個目錄,在這種情況下,Folder3。限制是文件夾可以有任何名稱,我不能重命名它。

所以我的問題是:

1)我怎麼能知道什麼目錄列表中的下?我想知道目錄的子目錄是否有一個連續的索引號,我可以用它來知道接下來會發生什麼。

2)因爲我想在腳本的末尾顯示新目錄的名稱,有沒有辦法只顯示目錄名稱? (如:Folder3代替的/ home /路徑/到/目錄/ Folder3這是「PWD」的結果)

+0

是否可以假設,每個文件夾只有一個裏面的文件夾? –

+1

請注意,您必須獲取腳本的源代碼,否則它將在子shell中運行並且無法更改當前shell的當前目錄。 – Neil

+0

或更高版本,請使用shell函數。 – jlliagre

回答

0
  1. 什麼定義要處理該目錄是順序?如果你有沒有空格和其他特殊字符的目錄在他們的名字,你可以使用ls列出目錄的順序,然後找到該名稱在當前目錄後:

    cwd=$(basename $PWD) 
    nwd=$(ls .. | awk "/^$cwd$/ { found = 1; next; } { if (found) { print; found = 0 } }") 
    if [ -d ../$nwd ] 
    then cd ../$nwd 
    fi 
    
  2. 目錄的名稱(僅)使用basename $PWD${PWD##*/}找到。

+0

這就是我正在尋找的,謝謝!我發現該腳本應該可以工作,但是當我嘗試採用它時,我收到「非法變量名稱」消息。你知道我錯過了什麼嗎? – user1433808

+0

你爲什麼要採購這樣的腳本?我可以看到的唯一可能的「非法變量名稱」是'$ {PWD ## * /}',如果你的shell不是'bash'並且不能識別'##'表示法。我仍然使用'basename',因爲我在四分之一世紀以前學會了它,它仍然有效。如果仍然存在問題,請使用'bash -x script'來查看它正在做什麼(而不會影響當前的shell)。然後返回一個報告('bash -x腳本'的輸出),如果你看不到自己是什麼,那麼麻煩在哪裏。 –

+0

我使用了bash -x腳本,並修復了我的腳本中的拼寫錯誤(感謝您向我介紹調試器)。但是,雖然腳本顯示在調試器中工作,但它運行在一個子shell中,因此不會真正更改目錄。當我收到非法變量名稱錯誤消息時,我試圖採用它,那就是。任何想法如何解決它? – user1433808

0

這應該工作,假設序列沒有漏洞。

cdn() 
{ 
    cd ${PWD%%[0-9]*}$(($(echo $PWD | sed 's/.*[^0-9]//')+1)) 
} 

編輯:我似乎忽略了「目錄可以有任何名稱」的聲明。從你的例子中,我認爲他們有一個尾隨的數字ID ...

如果你在你的例子中,你已經把隨機的名字,而不是Folderxx,這將是更清楚。

EDIT2:這裏是適合您的需求的外殼功能:

cdn() 
{ 
    for i in $(echo "/\/$(basename $PWD)$/ 
+1,\$p 
Q" | ed -s !"ls -d ../*" | tail -n +2) 
    do 
     \cd $i 2>/dev/null && echo $(basename $PWD) && break 
    done 
} 
+0

感謝您的回覆,抱歉的混淆! – user1433808

相關問題