pushd 및 popd 명령은 어떻게 사용합니까?

pushdpopd의 실제 용도는 무엇입니까? cdcd -보다이 두 명령을 사용하는 것이 유리할 때?

편집 :이 두 명령에 대한 실제 사용 예 또는 디렉토리와 스택을 유지하는 이유 (탭 완성이있는 경우 cd -, 단축을위한 별칭 cd .. 등).

답변

pushd , popd dirs 디렉토리 스택 을 조작 할 수 있습니다. 이는 디렉토리를 변경하는 데 사용할 수 있지만 원래 디렉토리로 돌아가는 데 사용할 수 있습니다.

예 :

다음 디렉터리로 시작 :

$ pwd /home/saml/somedir $ ls dir1 dir2 dir3 

pushd에서 dir1로

$ pushd dir1 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir1 ~/somedir 

dirs 명령은 현재 스택에 2 개의 디렉토리가 있음을 확인합니다. dir1 및 원본 디렉토리 인 somedir. 참고 : ” 현재 ” 디렉토리는 ~/somedir/dir1입니다.

pushd에서 ../ dir3 (지금은 dir1 안에 있기 때문)

$ pushd ../dir3 ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir3 

dirs는 현재 스택에 3 개의 디렉토리가 있음을 보여줍니다. dir3, dir1somedir. 방향을 확인하세요. 모든 새 디렉토리가 왼쪽에 추가됩니다. 디렉토리 팝업을 시작할 때 꺼져 있으면 “왼쪽에서도 나타납니다.

디렉토리를 ../dir2

$ cd ../dir2 $ pwd /home/saml/somedir/dir2 $ dirs ~/somedir/dir2 ~/somedir/dir1 ~/somedir 

이제 디렉토리 팝업 시작

$ popd ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir1 

dir1로 돌아 왔음을 알 수 있습니다.

다시 팝 …

$ popd ~/somedir $ pwd /home/saml/somedir 

우리는 시작했던 곳으로 돌아 왔습니다. somedir

p>

조금 혼란 스러울 수 있지만 stac의 머리는 k는 현재 사용자가있는 디렉토리입니다. 따라서 somedir로 돌아 가면 dirs에 다음이 표시되지만 :

$ dirs ~/somedir 

실제로 스택이 비어 있습니다.

$ popd bash: popd: directory stack empty 

댓글

  • 감사합니다. 스택의 개념과이 명령의 작동 방식을 완전히 이해했습니다. 그러나 ‘ 디렉토리와 함께 스택을 유지하는 실용적인 이유를 찾고 있습니다 (탭 완성, cd -, 단축을위한 별칭이있는 경우). div id = “e670ea3339”> 등).
  • pushd &를 자주 사용합니다. popd 스크립트 b / c는 내가 어디에서 왔는지 기억하지 않아도됩니다. 언제든지 popd에서 돌아올 수 있습니다. 내가 온 곳. 나는 보통 popd >/dev/null 2>&1를 사용하여 조용히합니다. 나는 나의 쉘에서 매일 cd-를 사용한다. 이 도움말에는 다른 시간 절약 팁도 있습니다. thegeekstuff.com/2008/10/ … .
  • @Garrett-내가 생각할 수있는 것은 없습니다.
  • @Garrett @slm 이후 cd -는 마지막 디렉토리 만 추적합니다. 내부적으로 디렉토리를 변경하는 함수를 호출하면 문제가 발생할 수 있습니다. 이 경우 함수는 다시 팝업하려는 디렉토리가 아닌 현재 디렉토리로 재설정됩니다. pushd / popd는 가장 안전한 방법입니다. 참고 : ‘ 내 이론을 테스트하지 않았습니다.
  • 첫 번째
    이후 ~/somedir/dir3로 돌아 가지 않는 이유 id = “9a953f50f0”>

    ?

답변

pushdpopd 명령 에 대한 정말 유용한 사용 사례 여러 폴더를 동시에 작업 할 수 있습니다.

스택이 열거되어 있으므로 매우 쉽게 탐색 할 수 있습니다. 즉, 작업 중에 여러 작업 폴더를 마음대로 사용할 수 있습니다.

아래의 간단한 예를 참조하세요.


먼저 폴더 구조의 예를 만들어 보겠습니다.

 user@vb:~$ mkdir navigate user@vb:~/navigate$ mkdir dir1 user@vb:~/navigate$ mkdir dir2 user@vb:~/navigate$ mkdir dir3 

그런 다음 모든 폴더를 스택에 추가 할 수 있습니다. :

 user@vb:~/navigate$ pushd dir1/ ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir1$ pushd ../dir2/ ~/navigate/dir2 ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir2$ pushd ../dir3/ ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate 

다음을 통해 검색 할 수 있습니다.

 user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir2 2 ~/navigate/dir1 3 ~/navigate 

안전하게 탐색하려면 항상 다시 작성되므로 마지막 (제로) 폴더를 두 번 추가해야합니다.

 user@vb:~/navigate/dir3$ pushd . user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate 

이제 이러한 폴더를 이동하여 작업 할 수 있습니다. 폴더의 별칭과 마찬가지로 스택.다음 부분은 자명 한 것 같습니다.

 user@vb:~/navigate/dir3$ cd ~4 user@vb:~/navigate$ dirs -v 0 ~/navigate 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate$ cd ~3 user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate/dir1$ touch text.txt user@vb:~/navigate/dir1$ cp text.txt ~2 user@vb:~/navigate/dir1$ ls ~2 text.txt user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate 

추가 팁 dirs -v에 대한 별칭을 만드는 것입니다.

예 :

# In ~/.bashrc alias dirs="dirs -v" 

댓글

  • 그리고 dirs -c
  • +1하여 스택을 지울 수 있습니다. 실제로 몇 가지 실용적인 예를 제공합니다. pushd / popd가 맨 페이지에서 수행하는 작업을 ‘ 쉽게 볼 수 있지만 처음에는 dirs 및 cd ~ #가 명확하지 않습니다.
  • 사용할 수도 있습니다. 대신 이러한 종류의 워크 플로를위한 fasd와 같은 솔루션이 있습니다.
  • @Jun, 거기 ‘ s ” mkdir dir {1,2,3} ” 한 번에 3 개의 디렉토리를 만들 수 있습니다.
  • @JunMurakami 올해를 맞이했습니다! 행복한 2020 년이 되세요!

답변

디스 스택을 사용하는 간단한 사용 사례 중 하나는 cd만으로는 할 수없는 일입니다. :

pushd .는 현재 디렉토리 XX를 dirs 스택에 추가합니다. 그런 다음 cd를 사용하여 이동할 수 있으며 XX로 돌아가려면 “멀리”에 있는지에 관계없이 popd를 수행하면됩니다. 디렉토리 트리 (여러 수준, 옆으로 건너 뛸 수 있음). bash 스크립트에서 특히 유용합니다.

댓글

  • 이 기능이 제가 가장 자주 이용하는 기능이라고 생각합니다. pushd / popdcd와 독립적으로 작동하므로보다 안정적인 북마크를 cd -보다.
  • 나에게는 사실이 아닙니다. cd를 사용할 때마다 스택이 변경됩니다.
  • 오, zsh를 사용했기 때문에 bash로 변경하면 정상적으로 작동합니다.
  • 비교에 관한 유일한 실질적인 대답입니다. cd-, IMO. foo를 눌렀는지 여부에 관하여; < 무작위 디렉토리 변경 >; popd는 a = foo보다 더 가치가 있습니다. cd $ a; < 무작위 디렉토리 변경 >; cd $ a … 스크립트의 경우 전자 (pushd)에서 작은 구문상의 편리함을 볼 수 있지만 후자 ([명시 적] 변수!)에서는 명확성이 크게 향상되었습니다. 대화 형 세션의 경우 처음에는 디렉토리 계층 구조가 제대로 구성되어 있다고 가정하고 길을 잃으면 cd ~ / back / to / obvious / path를 사용한다고 가정합니다.
  • @HarendraSingh you don ‘ AUTO_PUSHD가 설정되지 않았습니까? cdpushd처럼 작동하게하고 설정을 해제하면 ‘ ” 정상적인 동작 “.

답변

pushdpopd를 사용하면 스택의 디렉토리를 조작 할 수 있습니다.

디렉토리를 pushd하면 현재 디렉토리를 스택에 넣고 디렉토리를 매개 변수로 지정된 디렉토리로 변경합니다.

popd를 사용하면 스택의 디렉토리로 돌아갈 수 있습니다.

반복하면 디렉토리 순회가 일종의 보존되며 저장된 디렉토리의 역순으로 저장된 디렉토리로 돌아올 수 있습니다.

답변

bash 의 경우 기본적으로 : CD를 사용하는 대신 pushd를 사용하여 디렉토리를 변경하십시오. 실제 사용 : 방문한 디렉토리의 기록이 저장되고 (올바르게 : 스택 됨) 디렉토리간에 전환 할 수 있습니다.

pushd /home; pushd /var; pushd log 

스택을 보려면

및 더 쉬운 탐색을 위해 (” 스택 항목 수 ” 사용 :

dirs -v 

출력 :

me@myhost:/home$ dirs -v 0 /home 1 /var 2 /tmp 

이제 및 ~는 다음과 같습니다.

cd ~1 

하지만이 숫자는 지금 재 배열되어 ” 0 “가 변경되므로 pushd 디렉터리를 최상위 위치로 두 번 (또는 위치 0에 더미) :

me@myhost:/home$ dirs -v 0 /home 1 /home 2 /var 3 /tmp 

이제 1..3이 위치를 유지합니다.

(현재 디렉토리를 스택 / 기록에서 삭제, popd)

Answer

pushd / popd는 사람들이 이러한 명령을”디렉토리 스택을 조작 “하는 명령으로 정의하여 가르치는 경향이 있기 때문에 이해하는 데 시간이 걸리는 간단한 개념입니다. 제 생각에는 매우 혼란 스럽습니다.

다른 방식으로 봅니다.

pushd [folder_name] -[folder_name]으로 cd하고 문서 dir 스택에서 [folder_name] 인 대상을 최상위 디렉토리로 이동합니다. 스택의 현재 디렉토리는 항상 현재 디렉토리입니다.

popd -먼저 스택 맨 위에있는 디렉토리 레코드를 제거하고 문서를 제거합니다 (dir 스택에서 제거)

dirs -dir 스택을 인쇄합니다 (가장 왼쪽 항목이 현재 디렉토리 (스택 맨 위) 인 dir Db로 취급 될 수 있음)

따라서 가장 많이 사용되는 두 가지 사용 사례는 다음과 같습니다.

사용 사례 1 : pushd 및 popd를 사용한 탐색

root@mypc:/main/$ ls dir1 dir2 dir3 dir4 root@mypc:/main/$ dirs # prints the current stack /main root@mypc:/main/$ pushd dir1 # Will cd to dir1 and document dir1 in dir stack, stack is now: /main/dir1 /main root@mypc:/main/dir1$ # I am now in /main/dir1 root@mypc:/main/dir1$ # Now let"s go wild and document whatever I want root@mypc:/main/dir1$ pushd ../dir2 root@mypc:/main/dir2$ # Woo I am in /main/dir2 root@mypc:/main/dir2$ pushd ../dir3 root@mypc:/main/dir3$ # Woo I am in /main/dir3 root@mypc:/main/dir3$ pushd ../dir4 root@mypc:/main/dir4$ # Woo I am in /main/dir4 root@mypc:/main/dir4$ dirs # Now dir stack is: /main/dir4 /main/dir3 /main/dir2 /main/dir1 /main 

Let “s say 내가 문서화 한 폴더로 돌아가고 싶기 때문에 위의 작업을했습니다!

수동으로 cd하면 최상위 디렉토리 스택 항목 (항상 현재 디렉토리)에 영향을줍니다.

root@mypc:/main/dir4$ cd .. # Now dir stack is: # (note that /main appear in the leftmost as well which is the top of the stack) /main /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$ 

이제 뒤로 탐색 :

root@mypc:/main$ popd root@mypc:/main$ # Still in /main since it was at the top of the dir stack root@mypc:/main$ dirs # Stack is now: /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$ popd root@mypc:/main/dir3$ popd # Woo in dir3 now, about to navigate to dir2 root@mypc:/main/dir2$ popd # Woo in dir2, about to navigate to dir1 root@mypc:/main/dir1$ dirs # Stack is now: /main 

다시 원하는 경로를 문서화 할 수 있습니다. 그런 다음 수동으로 다른 디렉토리로 이동하면 스택에 삽입 한 문서화 된 디렉토리로 쉽게 돌아갈 수 있습니다.

사용 사례 2 : 숫자 스택 인덱스를 사용하여 탐색

내가 pushd dir4 dir3 dir2 dir1을 사용하여 푸시했다고 가정하겠습니다. 이제 dir -v를 실행하면 다음이 표시됩니다.

root@mypc:/main$ dirs -v 0 /main/dir1 (this is the current dir you are in always) 1 /main/dir2 2 /main/dir3 3 /main/dir4 

이제 스택 인덱스를 사용하여 디렉토리와 관련된 모든 Linux 작업을 수행 할 수 있습니다.

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt # this will run in the background, something like: # cp /main/dir2/temp.txt /main/dir3/new_temp.txt 

특정 항목을 삭제할 수도 있습니다. dir 스택의 항목 :

root@mypc:/main$ popd ~4 

“documenting”이라는 단어를 사용하거나 일종의 Db가 단순화되므로 dir 스택에 대해 생각해보십시오. 개념!

답변

간단히 말하면 두 개 이상의 디렉토리 사이를 탐색해야 할 때 일반적으로 여러 번 & 앞으로, cd -는 2 개 이상의 폴더로 잘라 내지 않습니다.

예를 들어, 버퍼의 히스토리를 보거나 긴 경로를 탭으로 완료하여 이전의 긴 경로를 다시 생성하려고하는 대신 중요한 경로를 단순히 쌓고 필요한 경우 번호만으로 편리하게 이동할 수 있습니다. 복잡한 디렉토리 구조와 긴 경로 사이의 회전은 매끄럽고 신속합니다.

내장 기능을 사용하면 스택을 재정렬하거나 더 이상 필요하지 않은 디렉토리를 표시하여 작업 흐름의 유연성을 높일 수 있습니다.

디렉토리 스태킹은 여러 디렉토리에 걸쳐있는 작업의 경우 스크립트에서도 유사하게 사용할 수 있습니다.

답변

I dirs / popd / pushd의 사용법이 약간 불편 함을 발견했습니다. .alias에 다음 코드를 추가하여 tcsh에서 개인 솔루션을 찾았습니다.

 foreach b (. , - 0 1 2 3 4 5 6 7 8 9 ) alias p$b "set a=`pwd`; echo $a >! ~/.mydir"$b alias cd$b "cd "`cat ~/.mydir"$b"`"" alias del$b "rm -v ~/.mydir"$b alias home$b "set a="~"; echo $a >! ~/.mydir"$b end alias cdl "grep / ~/.mydir*" 

예를 들어, “p.”라는 별칭을 지정하여 현재 작업 디렉토리를 ~ / .mydir. 파일에 저장하고 “cd.”를 지정하여 언제 어디서나 원하는 위치에 해당 디렉토리를 복구합니다. “del.”은 해당 파일을 제거합니다. “home.”은 dir을 home dir (cd; p.)로 설정하고 “cdl”은 저장된 디렉토리를 나열합니다. ~ / Dropbox / .mydir $ b (또는 다음과 같은 다른 클라우드 서비스를 사용하는 경우 예를 들어 ownCloud) ~ / .mydir $ b 대신 현명한 방법을 얻을 수 있습니다. 여러 계정과 컴퓨터에서 선호하는 디렉토리를 사용합니다.

답변

cdcd -를 사용하면 가장 최근에 사용한 두 디렉터리 사이를 전환 할 수 있습니다. “디렉토리 작업 세트”크기는 2입니다.

pushd를 사용하면 작업 세트에 임의로 많은 수의 디렉토리를 유지할 수 있습니다.

cd보다는 pushd를 대부분 사용합니다. pushd directory_name로 활성 디렉토리 스택을 구축 한 후에는 pushd ~#를 사용하여 하루 종일 이들 사이를 이동할 수 있습니다.

pushd dir1 pushd ../dir2 pushd /full/path/to/dir3 # There are now three directories in the stack. pushd ~3 pushd ~2 # The same three directories are still on the stack, # just in a different order. 

popd는 거의 사용하지 않습니다. 완료되었음을 알 때 스택에서 디렉토리를 제거하려는 경우에만 사용합니다. 해당 디렉토리를 사용합니다.

디렉토리로 이동하여 스택에서 제거합니다.

popd ~2 

현재 디렉토리에 머물면서 다른 디렉토리를 stack :

popd +2 

여러 터미널 창 또는 탭을 여는 것과 유사한 작업 스타일로 끝납니다 (활동중인 각 디렉토리에 하나씩). 작동), 그러나 모두 하나의 터미널에서.이렇게하면 화면 공간이 절약되고 디렉토리 경로가 모두 하나의 쉘에서 사용 가능하므로 다음과 같은 작업을 수행 할 수 있습니다.

  • 현재 작업중인 디렉토리간에 파일 복사
  • 다른 디렉토리로 이동하지 않고 다른 디렉토리의 파일보기 또는 수정

예 :

cp ~2/myfile.txt ~4 less ~2/myfile.txt 

tcsh (bash 아님), 디렉토리 스택을 파일에 저장하고 나중에 복원 할 수도 있습니다.

저장 :

dirs -S ~/dirstack 

복원 :

dirs -L ~/dirstack 

그렇지 않으면 iv id = “bc4f8b844b를 바꾸십시오. tcsh에서 사용하기위한 =가있는 bash 예제의 “>

.

pushd =2 popd =4 popd +1 

답변

내 bash_profile 및 .bashrc에서 이와 같이 사용하고 있습니다.

vi .bash_profile alias dirs="dirs -v" source d.sh :wq vi .bashrc alias dirs="dirs -v" :wq vi d.sh pushd ~/Documents/GIT/seiso-data pushd ~/Documents/GIT/ewe/EosRegistry pushd ~/Documents/GIT_LODGING/site-cookbooks pushd ~/Documents/CHEF_LODGING pushd . :wq 

도움말 내 터미널에서 가장 최근에 사용한 디렉토리로 이동합니다. 🙂 pushd 대신 popd를 사용하는 데 도움이되기를 바랍니다. cd ~ stackednumber

div를 사용합니다. >

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다