cd -
디렉토리 기록에서 훨씬 더 뒤로 돌아가기 위해 기록의 이전 디렉토리로 이동하는 것과 유사한 것을 어떻게 사용할 수 있습니까 ? 예를 들어 내 기록이 다음과 같다고 가정해 보겠습니다. (1은 현재입니다.)
- ~/
- ~/other디렉토리
- ~/정말/긴/디렉터리/이름/그/나는/하지 마세요/원합니다/to/입력/다시/하지만/하지 마세요/사용/충분히/to/make/an/별칭/for
여기를 사용하면 #2 cd -
로 돌아가고 다시 사용하면 정말 긴 디렉토리 #3(내가 들어가고 싶은 디렉토리) 대신 #1(내가 있고 싶지 않은) ~/otherDirectory
로 돌아갑니다. ~/
). 요약하자면, 디렉토리 기록으로 다시 이동하려면 어떻게 해야 합니까? 이 기능을 추가하기 위해 작성할 수 있는 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 동작을 사용하여 웹 브라우저 동작 시뮬레이션
웹 브라우저에서 URL A에서 URL B, URL C로 점프하면 앞뒤 화살표 키를 사용하여 두 URL 사이를 앞뒤로 이동할 수 있다는 사실을 알고 계시나요?
음, 우리는 다음 두 가지 기능을 사용하여 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
다른 쉘의 디렉토리 스택
csh
자체 디렉토리 스택 구현이 있지만 ksh
그렇지 않습니다. 당신은 사용할 수 있습니다 Eddie의 구현
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번 호출합니다.
아이노드 번호 사용
이 방법은 폴더 이름에 어려운 문자나 인식할 수 없는 문자가 있을 때 자주 사용됩니다. 사용하려는 디렉토리의 inode 번호를 찾은 다음 및 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
~/really/long/directory/name에 CD로 저장되어 있고 ~/really/long에만 들어가고 싶다면 cd ~/really/long
'long'의 하위 디렉토리에 있더라도 사용할 수 있습니다.
~/really/long을 방금 떠났다가 다시 그곳으로 돌아가고 싶다면 다음을 수행하면 됩니다.
Cd
그런 다음 위쪽 화살표를 사용하여 명령 기록을 통해 사용한 위치로 이동합니다.
Cd ~/really/long