ไฟล์ cp หรือ mv ไปยังไดเรกทอรีเดียวกันพวกเขาอยู่ในเมื่อฉันอยู่ในอีก?


12

ถ้าฉันอยู่~/blobและฉันมีไฟล์~/blob/a_long_directory_name/c/x.x

ฉันพิมพ์ได้

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

มีทางลัดใดบ้างโดยที่ฉันสามารถพิมพ์บางสิ่งที่สั้นกว่าซึ่งใช้เส้นทางไดเรกทอรีในพารามิเตอร์แรก (ไม่ใช่ไดเรกทอรีปัจจุบันของฉัน), เช่น

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

ที่สิ่งที่ต้องการ$same_dirจะชี้ไปที่ dir of param 1

คำตอบ:


8

หากต้องการลดจำนวนการพิมพ์ลงอาจทำได้ง่ายที่สุดในสองขั้นตอน ซีดีไปยังไดเรกทอรีแล้วย้าย

หากคุณมีเพียงคำสั่งเดียวคุณสามารถใช้เชลล์ย่อยได้:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

นั่นหมายความว่าcdจะมีผลบังคับใช้ใน subshell mvเท่านั้นและจะเกิดขึ้นหากcdสำเร็จและไดเรกทอรีการทำงานของเชลล์ปัจจุบันของคุณจะไม่เปลี่ยนแปลง

หากคุณมีมากกว่าหนึ่งคำสั่งให้ใช้ไดเรกทอรีสแต็ค

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

นี่ไม่ใช่ที่อยู่ของeven_moreเส้นทางญาติ ...
ไร้ประโยชน์

ถูกต้อง. ตัวอย่าง $ same_dir ดูเหมือนจะไม่สนใจเช่นกัน
Alan Shutko

+1 ฉันชอบมัน ง่ายต่อการจดจำและทำซึ่งเป็นกุญแจสำคัญสำหรับฉัน
Michael Durrant

น่าสนใจเพราะมันไม่ได้ทำในสิ่งที่คุณขอ บางทีคำถามของคุณอาจไม่ใช่สิ่งที่คุณตั้งใจ?
ไร้ประโยชน์

ไร้ประโยชน์ฉันอัปเดตชื่อของฉันเพื่อชี้แจงว่าเป็นเรื่องเกี่ยวกับไฟล์ cp / mv และเก็บไว้ในไดเรกทอรีเดียวกันแม้ว่าฉันจะอยู่ในที่อื่น BTW ชื่อผู้ใช้ของคุณเป็นคนน่ารัก แต่มันทำให้ความคิดเห็นดูโง่เมื่อนำมาใช้ในพวกเขา :)
ไมเคิล Durrant


5

คุณสามารถใช้ความสามารถในการทดแทนข้อความของเชลล์ ในbashคุณสามารถใช้สัตว์ร้ายเช่น:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

วิธีทำลายมัน:

!# บรรทัดปัจจุบันที่พิมพ์จนถึงตอนนี้

:$ขอให้เลือกคำสุดท้าย (แทนที่ด้วยตัวเลขnเพื่อเลือกnคำที่ ') ของสตริงภายใต้การพิจารณา ( !#ในกรณีนี้) คำสุดท้ายของบรรทัดที่พิมพ์จนถึงตอนนี้จะเป็นคำก่อนหน้า

:gs^xx^yyทำ global ( g) การแทนที่แบบข้อความ ( s) กับคำที่เป็นผลลัพธ์แทนที่ 'xx' ด้วย 'yy' ^เป็นเพียงตัวคั่นสำหรับsคำสั่งเพื่ออนุญาตให้ใช้/ในรูปแบบของคุณ

วิธีนี้เป็นวิธีที่ค่อนข้างกว้างกว่าปกติเล็กน้อยซึ่งช่วยให้คุณแทนที่ส่วนใดส่วนหนึ่งของเส้นทาง ('xx') ด้วยคำอื่น ๆ ('yy')

ในที่สุดเช่นเดียวกับการปรับแต่งประวัติใด ๆ ก็เป็นการดีที่มีชุดตัวเลือกเชลล์ที่เหมาะสม (เช่นใน~/.bashrc) ในกรณีนี้

shopt -s histverify

จะแสดงบรรทัดที่แก้ไขหลังจากที่คุณกด Return เพื่อให้คุณยังสามารถแก้ไขได้และตรวจสอบข้อผิดพลาด

ทำไมคุณถึงใช้สิ่งก่อสร้างแบบที่ฉันไม่แน่ใจ


a) เสียงรบกวนของสายมากเกินไป (เปรียบเทียบกับการขยายรั้งที่สง่างาม) b) ไม่สามารถแก้ปัญหาของ OP: พวกเขาต้องการแทนที่c/x.xด้วยevenmore/y.yการรักษาคำนำหน้าเส้นทางเดิม
Joseph R.

ความคิดเห็นที่สองของคุณเป็นการละเลยอย่างง่าย ๆ ในส่วนของฉันซึ่งต้องมีการแก้ไขอย่างง่ายเพื่อแก้ไข ฉันไม่เห็นว่าคำตอบนี้สมควรได้รับ downvote อย่างไร ด้วยการแก้ไข (ด้านเทคนิค) มันช่วยแก้ปัญหาและเป็นเรื่องทั่วไปมากกว่าเพราะมันช่วยให้การแลกเปลี่ยนส่วนใด ๆ ของเส้นทาง (ฉันมักจะใช้บางสิ่งที่คล้ายกัน$PWD) แน่นอนว่ามันอาจไม่ใช่สิ่งที่สวยงามที่สุด แต่มันชี้ให้เห็นว่าเชลล์มีการแทนที่ข้อความและตัวออกแบบคำซึ่งผู้ใช้บางคนอาจยังคงมีประโยชน์ต่อการวิจัย
Wojtek

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