เปลี่ยนไดเร็กทอรีเป็นเป้าหมายของการดำเนินการย้าย


12

บางครั้งฉันได้แก้ไขไฟล์บางไฟล์และต้องการย้ายไปยังโฟลเดอร์อื่น (โดยทั่วไป: ไปยังโฟลเดอร์ Dropbox ที่ฉันไม่ต้องการทำงานเพื่อหลีกเลี่ยงการให้เจ้าของรายอื่นอัปเดตค่าคงที่ของโฟลเดอร์) ตัวอย่างเช่นฉันด้วย

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

หลังจากนั้นฉันมักพบว่าตนเองต้องการเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีเป้าหมายของการดำเนินการย้ายครั้งก่อน ฉันพบตัวเองกดปุ่มลูกศรขึ้นลบสุดท้ายfile.pdfถือซ้าย, ลบและแทนที่ด้วยmv file.pdfcd

มีวิธีที่รวดเร็วและชาญฉลาดกว่าในการทำเช่นนี้หรือไม่? มีคำสั่ง "ย้ายไฟล์แล้วเปลี่ยนไดเรกทอรีเป็นคำสั่ง" หรือทางลัดสำหรับไดเรกทอรีที่ใช้ล่าสุดหรืออะไรแบบนั้น


1
ถ้าคุณกด CTRL + ซ้ายมันจะหายไปด้วยคำที่เร็วกว่า
cat

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

คำตอบ:


17

หากคุณกำลังใช้ bash การโต้ตอบประวัติจะมีเพียงทางลัดสำหรับสิ่งนี้ ตัวออกแบบคำสำหรับอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า:

!!:$
กำหนดอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า !$นี้อาจจะลงไป

รวมกับโมดิฟายเออร์เพื่อลบส่วนประกอบพา ธ สุดท้าย:

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

h
ลบองค์ประกอบชื่อเส้นทางต่อท้ายเหลือเพียงหัว

ดังนั้น:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

ทางลัดเดียวกันสามารถใช้กับ zsh


1
มันเจ๋งมาก
เอ็ลเดอ

4

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

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

ด้วยไดเรกทอรีเป็นอาร์กิวเมนต์สุดท้ายคุณสามารถใช้!!:$หรือ!$เป็นคำตอบของ muru อธิบาย
หากคุณใช้ทุบตีด้วยค่าเริ่มต้นปกติคุณสามารถใช้Alt+ .แทน
(นี่คือinsert-last-argumentคำสั่งreadline bind -pจะแสดงรายการการโยงปัจจุบันของคุณทั้งหมด)


1
โปรดทราบว่าการละเว้นชื่อไฟล์ปลายทางสามารถเขียนทับไฟล์ปลายทางหากไฟล์นั้นมีอยู่แล้ว
cat

mvมักจะเขียนทับไฟล์ปลายทางเงียบเว้นแต่คุณจะระบุตัวเลือก-i/ --interactiveหรือ/-n --no-clobberนั่นเป็นเหตุผลที่ผมมีในของฉันalias mv='mv -i' cp='cp -i' .bashrc
David Foerster

-1

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

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

โดยที่: (1) mv-specialเป็นชื่อฟังก์ชัน (2)ตัวแปร$1และ$2ข้อโต้แย้งในการทำงานที่จะถูกใช้โดยคำสั่งmvและcd; (3) $(echo $2-)เพิ่มอักขระ wildcat ที่ส่วนท้ายของสตริงใน var $2และแก้ไขพฤติกรรมของdirnameถ้าตัวแปร$2มีเพียงพา ธ (4) จะกรองเฉพาะเส้นทางจาก$(dirname $(echo $2-))$2

ตามคำตอบนี้ฟังก์ชั่นอาจมีลักษณะ:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

ที่ไหน: จะกรองเฉพาะเส้นทางจาก${2%/*}$2

เพื่อให้สามารถใช้งานได้ในฐานะคำสั่งฟังก์ชั่นนี้จะต้องส่งออก :

$ export -f mv-special

การใช้งาน:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

หรือ:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

โปรดใส่ใจกับสิ่งนั้น - สำหรับทั้งสองสายพันธุ์ - อาร์กิวเมนต์ที่สอง ( $2) จะต้องเสร็จสิ้นด้วยชื่อไฟล์หรือเครื่องหมายทับ ( /)

เพื่อให้คำสั่งใหม่ของเราพร้อมใช้งานอย่างถาวรคำจำกัดความของฟังก์ชันและคำสั่งส่งออกจะต้องผนวกเข้ากับ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

หรือ:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

ป้อนคำอธิบายรูปภาพที่นี่


คำสั่งที่กำหนดเองสามารถทำได้และผ่านไฟล์สคริปต์ที่เรียกใช้งานได้ซึ่งอยู่ใน~/binหรือใน/usr/sbin: ฉันจะสร้างคำสั่งเทอร์มินัลที่กำหนดเอง (เพื่อเรียกใช้สคริปต์) ได้อย่างไร? แต่ความจริงแล้วฉันกำลังประสบปัญหากับพฤติกรรมของcdในสถานการณ์นี้

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