ไฟล์ย้ายบรรทัดคำสั่งที่มีพา ธ ไดเร็กทอรีแบบยาวโดยไม่ต้องทำซ้ำพา ธ ไดเร็กทอรี


16

มีวิธีการดำเนินการmvคำสั่งใด ๆโดยไม่ต้องพิมพ์เส้นทางแบบเต็มในการโต้แย้งที่สอง?

ตัวอย่าง:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
มีเหตุผลใดที่คุณไม่สามารถcdไปยังไดเรคทอรีและmvออกจากที่นั่นได้?
zpletan

ฉันมักจะพบว่าตัวเองกำลังรันคำสั่งเหล่านี้ในหลายไดเรกทอรีในการทำงานแบบวันต่อวัน ฉันมักจะต้องดำเนินการหลายคำสั่งจากไดเรกทอรีหลักที่กำหนด
Finbarr

อย่างใดฉันก็พบว่าใช้ !! (เครื่องหมายอัศเจรีย์สองตัว) ในเทอร์มินัลใช้เพื่อเรียกใช้คำสั่งสุดท้ายที่ดำเนินการ คุณยังสามารถเพิ่มพารามิเตอร์ / ข้อความในคำสั่งสุดท้าย แต่ไม่เคยพยายามที่จะเปลี่ยน / ลบข้อความออกจากคำสั่งสุดท้าย ลองและถ้าคุณประสบความสำเร็จฉันจะทำแบบนี้เหมือนคำตอบ โชคดี!
Geppettvs D'Constanzo

คำตอบ:


32

คุณสามารถใช้การขยายรั้งของ bash นี้:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

จะขยายเป็น:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

จากนั้นmvจะรันด้วยอาร์กิวเมนต์สองตัวนั้น ดูhttp://wiki.bash-hackers.org/syntax/expansion/braceสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการขยายรั้ง


3
มันช่างรุ่งโรจน์ ฉันไม่รู้ว่าคุณสามารถทำได้
Finbarr

5

คุณสามารถใช้คุณลักษณะการขยายประวัติของ bash shell ได้แทน:

  • ! แนะนำการขยายประวัติ
  • # ตัวกำหนดเหตุการณ์แสดงถึงคำสั่งปัจจุบัน
  • $ ตัวออกแบบคำที่อ้างถึงอาร์กิวเมนต์สุดท้าย

คุณสามารถทำการทดแทนในการขยายตัวโดยใช้s/pattern/replacementไวยากรณ์เหมือนเช่นเช่น

somecommand path/to/foo.bar !#$:s/.bar/.baz

อดีต

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

หากคุณต้องการพา ธ โดยเฉพาะ (ตัวอย่างเช่นไปยังmvไฟล์ที่มีชื่อแตกต่างไปจากเดิมอย่างสิ้นเชิงที่ไม่ได้มาจากการทดแทน) คุณสามารถใช้โมดิhฟายเออร์:

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

สำหรับตัวเลือกอื่น ๆ รวมถึงreadlineคีย์ผสมเพื่อดึงอาร์กิวเมนต์สุดท้ายดูวิธีการพิมพ์พารามิเตอร์ใน bash console ซ้ำในปัจจุบันได้อย่างไร



2

ด้วยตัวแปร

  1. บันทึกไดเรกทอรีในตัวแปร: `DIR=./really/long/path/
  2. ใช้ย้าย: mv "$DIR"foo.bar "$DIR"foo.bz

ในหนึ่งบรรทัด: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


การเปลี่ยนไดเรกทอรี

  1. คุณสามารถcdไปยังไดเรกทอรีที่คุณต้องการทำงานใน:cd ./really/long/path
  2. จากนั้นเปลี่ยนชื่อไฟล์: mv foo.bar foo.bz

ในหนึ่งบรรทัด: cd ./really/long/path && mv foo.bar foo.bz


1
อันที่สองดูคุ้น ๆ ;-)
zpletan

2
ใช้ดีที่สุด&&ในหนึ่งซับสุดท้าย มิฉะนั้นหากcdล้มเหลวไฟล์mvจะทำงานในไดเรกทอรีที่ไม่ถูกต้องอาจเขียนทับไฟล์ ด้วยcd ./really/long/path && mv foo.bar foo.baz, mvจะได้รับการทำงานถ้าcdประสบความสำเร็จในการเปลี่ยนไดเรกทอรี
geirha

-3

คุณสามารถใช้คำสั่ง alias เพื่อย่อชื่อไดเรกทอรี:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 ให้alias test='/var/log' ; cd test -bash: cd: test: No such file or directory
zpletan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.