ในทุบตีฉันจะเปลี่ยนชื่อไฟล์โดยไม่ทำซ้ำเส้นทางได้อย่างไร [ซ้ำ]


39

ซ้ำได้:
ใช้ข้อความซ้ำในคำสั่ง bash

หากฉันต้องการเปลี่ยนชื่อไฟล์ให้ลึกลงไปสองสามไดเรกทอรีฉันจะหลีกเลี่ยงการทำซ้ำเส้นทางได้อย่างไร

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

mv path/to/old_filename.txt path/to/new_filename.txt

ฉันสงสัยว่ามีวิธีที่จะทำให้:

mv path/to/old_filename.txt (?)new_filename.txt

ไหน(?)จะเป็นวิธีที่บอกบางคน "ในไดเรกทอรีเดียวกัน."

คำตอบ:


26

ใช้การขยายประวัติทุบตี:

mv path/to/oldfile !#:1:h/newfile

โดยที่!#:1:hหมายถึง: จากบรรทัดที่คุณกำลังพิมพ์ ("! #") ใช้คำแรก (": 1") จากนั้นรับเฉพาะส่วนประกอบของเส้นทาง (": h" - ส่วนหัว) จากมัน


นี่คือสิ่งที่ใกล้เคียงที่สุดกับสิ่งที่ผู้ถามดั้งเดิมสันนิษฐานว่าอาจเป็นวิธีแก้ปัญหาและมีประโยชน์ที่จะรู้ดังนั้น +1
crazy2be

2
เย็น! ฉันคิดว่าวิธีการขยายของ Darth นั้นง่ายกว่า แต่ก็เป็นสิ่งที่ฉันต้องการ
Nathan Long

ฉันได้เรียนรู้สองสิ่งใหม่ที่ยอดเยี่ยมในวันนี้ นอกจากนี้ฉันจะคิดถึงการขยายรั้งเป็นตลอดไป "การขยายรั้ง Darth" เพราะมันฟังดูน่ากลัว
PileOfMush

62

คุณสามารถใช้การขยายรั้ง: mv path/to/{old_filename.txt,new_filename.txt}

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

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

a{b,c,dd,e}

จะถูกขยายเป็น

ab ac add ae

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


5
mv path/to/{old,new}_filename.txtหรือการรักษามันให้น้อยที่สุด: สิ่งนี้ยังช่วยในการกลับรายการหรือคำสั่งใกล้เคียงซ้ำ ๆ ผมได้ทำหลายครั้งเช่นความสามารถในการย้อนกลับกระบวนการโดยเปลี่ยนแปลงง่ายmv /etc/X11/xorg.conf{,.backup} mv /etc/X11/xorg.conf{.backup,}
Daniel Andersson

26

คำตอบของ Darthด้านบนนั้นฉลาด แต่ถ้าคุณต้องการใช้วิธีการด้วยcdคุณสามารถลองใช้ subshell:

(cd path/to && mv old_filename.txt new_filename.txt)

เนื่องจากการเปลี่ยนแปลงไดเรกทอรีเกิดขึ้นในเชลล์ย่อยคุณจะไม่เปลี่ยนไดเรกทอรีในเชลล์เชิงโต้ตอบของคุณ


1
ข้อเสียเปรียบที่สำคัญ: คุณไม่สามารถใช้การทำให้แท็บเสร็จสมบูรณ์old_filename.txtได้
bluenote10

9

ทางเลือกอื่นที่มีประโยชน์หากคุณจะทำหลายคำสั่งในไดเรกทอรีคือ:

pushd /path/to
mv oldfile newfile
...
popd

5

ผมชอบ@ คำตอบของดาร์ท นี่คือทางเลือก:cd path/to && mv oldfile newfile && cd -


1
หมายเหตุหากmvล้มเหลว (เช่นไม่มีสิทธิ์) คุณจะถูกทิ้งไว้ในpath/toไดเรกทอรี คุณสามารถลองcd path/to && mv oldfile newfile ; cd -ให้แน่ใจว่าcd -ทำงานอยู่เสมอยกเว้นหากcd path/to(ไม่มีการอนุญาต) ล้มเหลวคุณจะยังคงดำเนินการcd -และไปที่ไดเรกทอรีก่อนหน้าซึ่งไม่ต้องการ คำตอบ subshell mlc (+1) ดีกว่า ฉันเดาว่าcd . && cd path/to && mv oldfile newfile ; cd -จะทำงานได้ 99.9% ของเวลา (โดยมีcd .เพียงความล้มเหลวหากคุณหรือสิทธิ์ dirs ปัจจุบันของคุณเปลี่ยนไปและในกรณีนี้การไปยัง dir อื่นนั้นไม่ได้ผลที่เลวร้ายเลย)
dr jimbob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.