CD - 더 깊은 역사 속으로

CD - 더 깊은 역사 속으로

cd -디렉토리 기록에서 훨씬 더 뒤로 돌아가기 위해 기록의 이전 디렉토리로 이동하는 것과 유사한 것을 어떻게 사용할 수 있습니까 ? 예를 들어 내 기록이 다음과 같다고 가정해 보겠습니다. (1은 현재입니다.)

  1. ~/
  2. ~/other디렉토리
  3. ~/정말/긴/디렉터리/이름/그/나는/하지 마세요/원합니다/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의 조합을 사용합니다 .findcd

$> 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

관련 정보