ฉันจะใช้คำสั่ง pushd และ popd ได้อย่างไร


332

อะไรคือการใช้งานจริงของทั้งสองpushdและpopdเมื่อมีข้อได้เปรียบในการใช้ทั้งสองคำสั่งมากกว่าcdและcd -?

แก้ไข : ฉันกำลังมองหาตัวอย่างของการใช้งานจริงสำหรับทั้งสองคำสั่งหรือเหตุผลในการเก็บสแต็คกับไดเรกทอรี (เมื่อคุณมีแท็บเสร็จcd -, นามแฝงสำหรับการย่อcd ..ฯลฯ )

คำตอบ:


304

pushd, popdและdirsมี builtins เปลือกที่ช่วยให้คุณจัดการกับสแต็คไดเรกทอรี สามารถใช้เพื่อเปลี่ยนไดเรกทอรี แต่กลับไปยังไดเรกทอรีที่คุณมา

ตัวอย่างเช่น

เริ่มต้นด้วยไดเรกทอรีต่อไปนี้:

$ ls
dir1  dir2  dir3

กดไปที่ dir1

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

dirsคำสั่งยืนยันว่าเรามี 2 ไดเรกทอรีในสแต็กตอนนี้ และผบเดิมdir1somedir

pushd to ../dir3 (เพราะเราอยู่ข้างในdir1ตอนนี้)

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

dirsแสดงว่าเรามี 3 ไดเรกทอรีในกองซ้อนในขณะนี้ dir3, และdir1 somedirสังเกตทิศทาง ทุกไดเรกทอรีใหม่จะถูกเพิ่มทางด้านซ้าย เมื่อเราเริ่มเปิดไดเรคทอรีปิดไดเรกทอรีพวกเขาจะมาจากทางซ้ายเช่นกัน

เปลี่ยนไดเรกทอรีเป็นด้วยตนเอง ../dir2

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

ตอนนี้เริ่ม popping ไดเรกทอรี

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

dir1ขอให้สังเกตที่เราโผล่กลับไป

ป๊อปอีกครั้ง ...

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

somedirและเรากลับมาที่เราเริ่มต้น

อาจทำให้สับสนเล็กน้อย แต่หัวของสแต็คเป็นไดเรกทอรีที่คุณอยู่ในปัจจุบันดังนั้นเมื่อเรากลับไปsomedirถึงแม้ว่าจะdirsแสดงสิ่งนี้:

$ dirs
~/somedir

สแต็กของเราว่างเปล่า

$ popd
bash: popd: directory stack empty

19
ขอบคุณฉันเข้าใจแนวคิดของกองซ้อนทั้งหมดและคำสั่งนี้ทำงานอย่างไร อย่างไรก็ตามฉันกำลังมองหาสาเหตุบางประการในการเก็บสแต็คกับไดเรกทอรี (เมื่อคุณมีแท็บเสร็จcd -, นามแฝงสำหรับการย่อcd ..ฯลฯ )
syntagma

21
ฉันมักจะใช้pushd& popdในสคริปต์ b / c พวกเขาช่วยฉันไม่ให้จำว่าฉันมาจากไหนฉันสามารถpopdกลับมาจากที่ที่ฉันมาได้เสมอ ฉันมักจะทำpopd >/dev/null 2>&1เพื่อให้เงียบ ฉันใช้ cd- ทุกวันในเปลือกของฉัน : มีเคล็ดลับประหยัดเวลาอื่น ๆ ในบทความนี้เช่นกันthegeekstuff.com/2008/10/...
slm

2
@ Garrett - ไม่มีสิ่งใดที่ฉันสามารถตั้งครรภ์ได้
slm

4
@Garrett @slm ตั้งแต่cd -ติดตามเฉพาะไดเรกทอรีสุดท้ายฉันคิดว่าเป็นไปได้ที่จะมีปัญหาหากคุณเรียกใช้ฟังก์ชันที่เปลี่ยนไดเรกทอรีภายใน ในกรณีนั้นฟังก์ชันจะสิ้นสุดการรีเซ็ต - ไปยังไดเรกทอรีปัจจุบันของคุณไม่ใช่ไดเรกทอรีที่คุณต้องการกลับมา pushd / popd เป็นวิธีที่ปลอดภัยที่สุด หมายเหตุ: ฉันไม่ได้ทดสอบทฤษฎีของฉัน
Bile Phile

5
ทำไมไม่กลับไป~/somedir/dir3หลังจากครั้งแรกpopd?
ziyuang

198

มีกรณีการใช้งานที่มีประโยชน์จริง ๆpushdและpopdคำสั่งสำหรับการทำงานกับหลาย ๆ โฟลเดอร์พร้อมกัน

คุณสามารถนำทางสแต็กได้ง่ายมากเนื่องจากถูกระบุ หมายความว่าคุณสามารถมีโฟลเดอร์การทำงานได้หลายโฟลเดอร์ในระหว่างการทำงาน

ดูตัวอย่างง่ายๆด้านล่าง


ขั้นแรกให้สร้างตัวอย่างโครงสร้างโฟลเดอร์

    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"

28
และคุณสามารถล้างสแต็กได้โดยdirs -c
Jun Murakami

19
+1 สำหรับให้ตัวอย่างที่เป็นประโยชน์จริง ๆ เป็นเรื่องง่ายที่จะเห็นสิ่งที่ pushd / popd ทำจากหน้า man แต่ dirs และ cd ~ # ไม่ชัดเจนในตอนแรก
Scribblemacher

คุณสามารถใช้โซลูชันเช่น fasd สำหรับเวิร์กโฟลว์ชนิดนี้แทนได้
WuTheFWas ที่

ดังนั้นจะดีกว่าสำหรับกรณีการใช้งานชั่วคราวมากกว่าการตั้งค่า CDPATH หรือไม่
rfabbri

2
@ มิ.ย. มี "mkdir dir {1,2,3}" เพื่อสร้าง 3 ไดเรกทอรีในนัดเดียว
Bulat M.

39

กรณีใช้งานง่าย ๆ อย่างหนึ่งสำหรับการใช้ dirs stack สิ่งที่คุณไม่สามารถทำได้โดยแค่ cd คือ:

pushd .เพิ่ม XX ไดเรกทอรีปัจจุบันไปยังdirsสแต็ค หลังจากนั้นคุณสามารถเลื่อนไปมาโดยใช้cdและกลับไปที่ XX คุณทำได้popdโดยไม่คำนึงว่าคุณอยู่ไกลแค่ไหนในไดเรคทอรีต้นไม้ (สามารถกระโดดข้ามหลายระดับไปด้านข้าง ฯลฯ ) มีประโยชน์อย่างยิ่งในสคริปต์ทุบตี


2
ฉันคิดว่านี่เป็นคุณสมบัติที่ฉันใช้ประโยชน์จากบ่อยที่สุด เพราะpushd/ popdการทำงานเป็นอิสระจากคุณสามารถใช้พวกเขาเป็นบุ๊คมาร์คเสถียรภาพมากขึ้นกว่าcd cd -
Gordon Bean

สำหรับฉันนี้ไม่เป็นความจริง ทุกครั้งที่ฉันใช้ cd การเปลี่ยนแปลงของฉัน
Harendra Singh เมื่อ

โอ้นั่นคือ coz ของการใช้ zsh เมื่อฉันเปลี่ยนเป็นทุบตีมันใช้งานได้ดี
Harendra Singh

4
นี่เป็นคำตอบเดียวที่สำคัญเกี่ยวกับการเปรียบเทียบกับ cd -, IMO ไม่ว่าจะเป็น pushd foo; <การเปลี่ยนแปลงแบบสุ่ม dir>; popd คุ้มค่ากว่า a = foo cd $ a; <การเปลี่ยนแปลงแบบสุ่ม dir>; cd $ a ... สำหรับสคริปต์ฉันสามารถเห็นความสะดวกสบายของประโยคเล็ก ๆ ในอดีต (pushd) แต่มีการปรับปรุงอย่างมากในความชัดเจนในหลัง (ตัวแปรชัดเจน)! สำหรับเซสชั่นแบบโต้ตอบฉันคิดว่าฉันแค่คิดว่ามีการจัดลำดับชั้นไดเรกทอรีของฉันอย่างถูกต้องในสถานที่แรกและถ้าฉันหลงทางเพียง cd ~ / back / to / ชัดเจน / เส้นทาง
ม.ค. Kyu Peblik

9

pushdและpopdอนุญาตให้คุณจัดการไดเรกทอรีบนสแต็ก

เมื่อคุณpushdไดเร็กทอรีคุณวางไดเร็กทอรีปัจจุบันบนสแต็กและเปลี่ยนไดเร็กทอรีเป็นไดเร็กทอรีที่ระบุเป็นพารามิเตอร์

popd จะช่วยให้คุณกลับไปที่ไดเรกทอรีในสแต็ก

หากคุณทำซ้ำการสำรวจเส้นทางไดเรกทอรีจะถูกเก็บรักษาไว้และคุณสามารถกลับมาที่ไดเรกทอรีที่บันทึกไว้ในลำดับย้อนกลับจากสิ่งที่คุณบันทึกไว้


6

สำหรับทุบตีโดยทั่วไป: แทนที่จะใช้ cd หนึ่งสามารถใช้pushdเพื่อเปลี่ยนไดเรกทอรีด้วยการใช้งานจริง: ประวัติของไดเรกทอรีที่เข้าชมจะถูกบันทึกไว้ (ถูกต้อง: ซ้อนกัน) และหนึ่งสามารถสลับระหว่างพวกเขา

pushd /home; pushd /var; pushd log

หากต้องการดูการใช้สแต็กdirsและการนำทางที่ง่ายขึ้น (เพื่อรับหมายเลขของการใช้ "รายการสแต็ก":

dirs -v

เอาท์พุท:

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

ตอนนี้ใช้ตัวเลขเหล่านี้ด้วยcdและ~ชอบ:

cd ~1

แต่ตัวเลขเหล่านี้จะถูกจัดเรียงใหม่ในขณะนี้และตำแหน่ง "0" จะเปลี่ยนดังนั้นเพียงpushdไดเรกทอรีไปยังตำแหน่งบนสุดสองครั้ง (หรือใช้จำลองที่ตำแหน่ง 0) เช่น:

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

ตอนนี้ 1..3 จะรักษาตำแหน่ง

(เพื่อปล่อยไดเรกทอรีปัจจุบันจากสแต็ค / ลบออกจากการใช้ประวัติpopd)


5

การใช้งานจริงอย่างหนึ่งที่ฉันได้พบคือสลับระหว่างไดเรกทอรีที่ใช้ pushd และ popd

สมมติว่าเรามีสองไดเรกทอรี dir1 และ dir2 และฉันจำเป็นต้องสลับระหว่างพวกเขาอย่างต่อเนื่องด้วยเหตุผล xyz บางอย่าง

ขณะนี้ฉันอยู่ในซัมมีเดียซึ่งมีสองไดเรกทอรีdir1และdir2:

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

ตอนนี้ฉันเปลี่ยนเป็น dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

ตอนนี้ฉันจะเพิ่มdir1ไปที่สแต็คและเปลี่ยนเป็นdir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

อย่างที่คุณเห็นตอนนี้ฉันมีdir2และdir1ซ้อนdir2กันแล้ว

ตอนนี้เปลี่ยนกลับไปผมจะทำงานdir1pushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Voila ฉันเป็น dir1 และฉันมี dir1 และ dir2 บนสแต็ก หากต้องการเปลี่ยนกลับเป็น dir2 ให้เรียกใช้อีกครั้งpushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

นี่เป็นวิธีง่ายๆในการสลับระหว่างไดเรกทอรี ทีนี้คุณจะรู้อะไรทำไมฉันต้องสลับระหว่างไดเรกทอรี? กรณีใช้อย่างหนึ่งคือเมื่อฉันทำงานกับเว็บแอปพลิเคชันฉันมีไฟล์ทำในไดเรกทอรีเดียวและไฟล์บันทึกของฉันในไดเรกทอรีอื่น บ่อยครั้งเมื่อทำการดีบั๊กแอปพลิเคชันฉันต้องสลับระหว่างไดเรกทอรีบันทึกเพื่อตรวจสอบบันทึกล่าสุดแล้วสลับกลับไปที่ไดเรกทอรีทำเพื่อทำการเปลี่ยนแปลงและสร้างแอปพลิเคชัน


11
(1) คำถามถามว่า "อะไรคือข้อดีของpushdและpopdมากกว่าcd -" คุณยังไม่ได้ตอบคำถามอย่างชัดเจนขณะที่คุณกำลังอธิบายสิ่งที่cd -ทำ (2) ประเด็นของการพูดpushd || popdคืออะไร? ใช่ฉันรู้ว่าcmdA || cmdBหมายถึงการทำงานและถ้ามันล้มเหลวแล้วเรียกใช้cmdA cmdBฉันถามว่ามันทำอะไรได้ดีในบริบทนี้  pushdโดยไม่มีข้อโต้แย้งหมายถึง "สลับองค์ประกอบสองอันดับแรกในไดเรกทอรีสแต็ก"; มันล้มเหลวหากไดเรกทอรีปัจจุบันเป็นองค์ประกอบเดียวในไดเรกทอรีสแต็ค ในกรณีนั้นpopdจะล้มเหลวด้วย
G-Man

3
ฉันไม่อยากจะเชื่อเลยว่าไม่มีใครโหวตคุณ! ช่วยชีวิต! แฮ็คช่างวิเศษเหลือเกิน ขอบคุณ สลับในความคิดของฉันกรณีที่ใช้สำหรับการและ pushdpopd
Sonny

3
มีวิธีการที่แตกต่างกันสองวิธีที่ต้องการการพิมพ์น้อยกว่าpushd || popdเพื่อสลับระหว่างไปยังไดเรกทอรี: pushdโดยไม่มีการขัดแย้งใด ๆ cd -มีอยู่อย่างชัดเจนเพียงเพื่อสลับกลับไปยังไดเรกทอรีสุดท้าย นอกจากนี้คำถามที่ถามหาประโยชน์จากpushdกว่าcd -ในขณะที่คำตอบนี้อย่างชัดเจนให้อะไร แต่ข้อเสีย: การพิมพ์มากขึ้น
Benjamin Riggs

ในทุบตีไม่มีข้อโต้แย้ง pushd แลกเปลี่ยนสองอันดับแรกของไดเรกทอรีและส่งกลับ 0 ทำไมคุณต้องการ|| popdสลับ? กรุณาอธิบาย. (มันดันไม่พอใช่มั้ย)
Johnny Wong

@Sonny ใช้cd -เพื่อสลับระหว่างสองไดเรกทอรี นอกจากนี้cdไม่มีข้อโต้แย้งกลับไปที่ไดเรกทอรีบ้านของคุณ
Steve

2

ใส่เพียง - เมื่อคุณต้องการนำทางระหว่างไดเรกทอรีมากกว่า 2 แห่งมักจะกลับมาหลายครั้งเพราะcd -จะไม่ตัดมันไปกับสิ่งอื่นนอกเหนือจาก 2 โฟลเดอร์

ตัวอย่างเช่นแทนที่จะพยายามหาเส้นทางยาวก่อนหน้านี้อีกครั้งโดยดูที่ประวัติของบัฟเฟอร์หรือแท็บที่กรอกเส้นทางยาวให้คุณเพียงแค่วางสิ่งที่สำคัญขึ้นมาและถ้าจำเป็น การหมุนระหว่างโครงสร้างไดเรคทอรีที่ซับซ้อนและเส้นทางยาวกลายเป็นลื่นและรวดเร็ว

builtins ยังช่วยให้คุณสามารถสั่งซื้อสแต็กใหม่หรือเปิดไดเรกทอรีที่คุณไม่ต้องการอีกต่อไปซึ่งจะช่วยให้มีความยืดหยุ่นในกระบวนการทำงานของคุณ

การซ้อนไดเร็กทอรีสามารถใช้ในสคริปต์คล้ายกันสำหรับการดำเนินการที่ครอบคลุมหลายไดเร็กทอรี


1

ฉันพบการใช้งานของ dirs / popd / pushd ค่อนข้างอึดอัด ฉันคิดวิธีแก้ไขปัญหาส่วนตัวเป็น tcsh โดยเพิ่มรหัสต่อไปนี้เป็น. alias

  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." เพื่อบันทึก dir ทำงานปัจจุบันลงในไฟล์ ~ / .mydir และ "cd." เพื่อกู้ผบผบ. และเมื่อใดก็ตามที่ฉันต้องการ "เดล." ลบไฟล์ที่เกี่ยวข้อง; "บ้าน." ตั้งค่า dir เป็น dir ที่บ้าน (เทียบเท่ากับ cd; p.); "cdl" แสดงสิ่งที่ dirs ที่บันทึกไว้ โปรดทราบว่าหากคุณใช้ ~ / Dropbox / .mydir $ b (หรือบริการคลาวด์อื่น ๆ เช่น ownCloud) แทน ~ / .mydir $ b คุณจะได้รับวิธีที่ชาญฉลาดในการใช้ dirs ที่คุณต้องการในบัญชีและเครื่องต่างๆ


0

ฉันใช้มันแบบนี้ใน 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


0

การใช้cdและcd -อนุญาตให้คุณสลับระหว่างไดเรกทอรีที่ใช้ล่าสุดสองรายการเท่านั้น ขนาด "ชุดการทำงานของไดเรกทอรี" ของคุณมีสองขนาด

ใช้pushdคุณสามารถเก็บไดเรกทอรีจำนวนมากในชุดการทำงานของคุณโดยพลการ

ผมใช้เวลาส่วนใหญ่ของมากกว่าpushd cdเมื่อคุณได้สร้างขึ้นสแต็คของไดเรกทอรีที่ใช้งานอยู่กับคุณแล้วคุณสามารถข้ามไปมาระหว่างพวกเขาตลอดทั้งวันด้วยpushd directory_namepushd ~#

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

อยู่ในไดเรกทอรีปัจจุบันและลบไดเรกทอรีอื่นออกจากสแต็ก:

popd +2

คุณจบลงด้วยสไตล์การทำงานที่คล้ายกับการเปิดหน้าต่างเทอร์มินัลหรือแท็บหลายอัน (หนึ่งอันสำหรับแต่ละไดเรกทอรีที่คุณใช้งานอยู่) แต่ทั้งหมดนั้นอยู่ในเทอร์มินัลเดียว สิ่งนี้จะช่วยประหยัดอสังหาริมทรัพย์บนหน้าจอรวมทั้งเนื่องจากเส้นทางไดเรกทอรีทั้งหมดมีอยู่ในเปลือกเดียวคุณสามารถทำสิ่งต่าง ๆ เช่น:

  • คัดลอกไฟล์ระหว่างไดเรกทอรีที่คุณกำลังทำงานด้วย
  • ดูหรือแก้ไขไฟล์ในไดเรกทอรีอื่นโดยไม่ต้องไปที่นั่น

ตัวอย่าง:

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

ในtcsh(แต่ไม่ใช่bash) คุณสามารถบันทึกไดเรกทอรีสแต็คของคุณไปยังไฟล์และเรียกคืนได้ในภายหลัง

ประหยัด

dirs -S ~/dirstack

Restore:

dirs -L ~/dirstack

มิฉะนั้นเพียงแค่เปลี่ยน~ในbashตัวอย่างที่มีการใช้งานใน=tcsh

pushd =2
popd =4
popd +1

0

pushd / popd นั้นเป็นแนวคิดที่เรียบง่ายซึ่งทำให้ฉันเข้าใจสักครู่เพราะคนมักจะสอนมันโดยการกำหนดคำสั่งเหล่านี้เป็นคำสั่งที่ 'จัดการกับไดเรกทอรีสแต็ค' ซึ่งในความคิดของฉันสับสน

ฉันดูมันในวิธีที่แตกต่าง:

pushd [folder_name] - จะ cd ไปที่ [folder_name] และจะบันทึกปลายทางซึ่งเป็น [folder_name] ในสแต็ก dir ในขณะที่ไดเรกทอรีบนสุดในสแต็กจะเป็น dir ปัจจุบันที่คุณอยู่

popd - คุณจะ cd ครั้งแรกในเรคคอร์ดไดเร็กทอรีซึ่งอยู่ด้านบนสุดของสแต็กจากนั้นลบออกจากสแต็ก

dirs - จะพิมพ์สแต็ค dir (สามารถถือว่าเป็น dir Db โดยที่รายการด้านซ้ายสุดคือไดเรกทอรีปัจจุบัน (ด้านบนของสแต็ก)

ดังนั้นกรณีใช้งานที่ได้รับความนิยมมากที่สุด 2 กรณีคือ:

ใช้กรณีที่ 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

สมมติว่าฉันได้ทำไปแล้วเนื่องจากฉันต้องการนำทางกลับไปยังโฟลเดอร์ที่ฉันบันทึกไว้!

โปรดทราบว่าถ้าฉัน cd ด้วยตนเองฉันจะส่งผลกระทบต่อรายการสแต็ค dir ด้านบน (ซึ่งมักจะ dir ปัจจุบัน)

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

ฉันสามารถทำเอกสารอะไรก็ได้ที่ฉันต้องการและจากนั้นนำทางด้วยตนเองไปยัง dir อื่นจากนั้นฉันก็จะสามารถกลับไปที่ dir เอกสารที่ฉันใส่เข้าไปในสแต็กได้อย่างง่ายดาย

ใช้กรณีที่ 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 stack:

root@mypc:/main$ popd ~4

หวังว่าการใช้คำว่า "documenting" หรือคิดเกี่ยวกับ dir stack เพราะ Db บางประเภททำให้แนวคิดง่ายขึ้น!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.