我如何使用類似的東西cd -
,它會轉到歷史記錄中的上一個目錄,以便在目錄歷史記錄中進一步返回?例如,假設我的歷史記錄是:(1 是當前的。)
- 〜/
- ~/other目錄
- ~/rely/long/directory/name/that/i/dont/want/to/type/again/but/dont/use/enough/to/make/an/alias/for
使用cd -
這裡會將我帶到~/otherDirectory
#2,如果我再次使用它,它會讓我回到~/
#1(我不想進入)而不是非常長的目錄#3(我確實想進入) )。總之,如何進一步導航回目錄歷史記錄?我可以編寫一些 bash 來添加此功能嗎?
我正在嘗試返回目錄歷史記錄(不僅僅是一個目錄),就像使用向上箭頭瀏覽命令歷史記錄一樣。希望這能澄清這個問題以前沒有被問過。
答案1
Bash 中的目錄堆疊
DIRSTACK
bash 中有一個稱為目錄堆疊的東西。堆疊是電腦科學中的一種基本資料結構,您可以在其中將元素儲存在彼此的頂部(就像書堆一樣),但只能存取最近的元素(頂部)。
這是一個小演示 - 每次我將某些內容推送到目錄堆疊時,我當前的工作目錄都會設定為該專案;每次我彈出 - 我們從堆疊中刪除頂部(最左邊)的項目,並返回下一個可用項目:
$> # pushd navigates to and stores the directory given
$> pwd
/home/xieerqi
$> pushd bin
~/bin ~
$> pushd /etc
/etc ~/bin ~
$> # popd deletes leftmost item, returns to next directory on left$> pwd
/etc
$> popd
~/bin ~
$> pwd
/home/xieerqi/bin
$>
最新的項目始終儲存在堆疊的頂部,即使您使用cd
$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$>
這個dirs
指令允許我們從堆疊中檢索第 n 個元素。使用該輸出作為參數,cd
我們可以導航到堆疊上的任何目錄,而不會影響堆疊本身。請注意,即使我更改了當前的工作目錄(以及頂部元素),下面的/etc/
和(堆疊元素 1 和 2)仍然保持不變~
$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~
使用 DIRSTACK 行為來模擬 Web 瀏覽器行為
您知道在網頁瀏覽器中,如果您從 url A 跳到 url B 和 url C,您可以使用後退和前箭頭鍵在它們之間來回移動嗎?
好吧,我們可以在 bash 中使用這兩個函數執行相同的操作:
cd()
{
if [ $# -eq 0 ]; then
pushd "$HOME" > /dev/null
else
pushd "$@" > /dev/null
fi
}
cdback()
{
popd > /dev/null
printf "Returned to:%s\n" "$( dirs +0)"
}
函數優先於別名,因此我們可以利用它來發揮我們的優勢,並對給出的每個參數進行每次cd
調用pushd
(如果沒有給出,我們返回主目錄,相同的行為,但它被記錄)
$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi
其他 shell 中的目錄堆疊
csh
有自己的目錄堆疊實現,但ksh
沒有。你可以使用 艾迪的實施
使用 for 迴圈向上
至於要向上移動一定數量的目錄,您可以寫一個呼叫cd ..
一定次數的函數。例如,這是我的自訂函數.bashrc
function goUp # go up x number of dirs
{
num=$1
while [ num -ne 0 ];do
cd ..
num=$( expr $num - 1 )
done
}
# ---
所以我將其稱為goUp 3
向上 3 個目錄,並且它會呼叫cd ..
3 次
使用索引節點號
當資料夾名稱有困難字元/無法辨識的字元時,請經常使用此技巧。我們找到您想要使用的目錄的索引節點號stat
,然後使用find
和的組合cd
$> stat $HOME/bin/sh/
File: ‘/home/xieerqi/bin/sh/’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 5795531 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ xieerqi) Gid: ( 1000/ xieerqi)
Access: 2015-08-19 15:27:38.280529273 -0600
Modify: 2016-02-20 17:03:49.822700405 -0700
Change: 2016-02-20 17:03:49.822700405 -0700
Birth: -
$> cd $(find $HOME -inum 5795531 -type d 2>/dev/null)
$> pwd
/home/xieerqi/bin/sh
當然,這可能有點慢,因為find
遞歸地遍歷整個目錄樹。
答案2
如果您 cd 到 ~/really/long/directory/name,並且您只想位於 ~/really/long,cd ~/really/long
即使您位於“long”的子目錄中,也可以使用
如果你剛離開〜/really/long並且你想回到那裡,你可以這樣做
Cd
然後使用向上箭頭瀏覽命令記錄到您使用過的位置
Cd ~/really/long