วิธีที่รวดเร็วที่สุดในการเปลี่ยนชื่อไฟล์โดยไม่ต้องพิมพ์เส้นทางของไดเรกทอรีใหม่


56

ฉันรู้วิธีเปลี่ยนชื่อไฟล์ใน Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

ใช้เวลานานเกินไปในการทำซ้ำ~/folder/subfolder/fileสองครั้ง

มีวิธีที่เร็วกว่านี้ไหม

คำตอบ:


104

ถ้าเปลือกของคุณได้รับการสนับสนุน รั้งการขยายตัว (ทำงานร่วมกับcsh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashกับรั้งขยายเปิดการใช้งานโดยการเรียกyash --brace-expandหรือตั้งในเปลือก Interative ด้วยset -o brace-expandหรือfish):

mv ~/folder/subfolder/file.{txt,sh}

4
ง่ายดีที่สุด!
Braiam

2
ใช้การขยายตัวที่ยอดเยี่ยมในเชลล์อย่างยอดเยี่ยม!
harish.venkat

3
มันเป็นที่น่ากลัว แต่จริงๆเป็นความลับ มันใช้งานได้ แต่ในครั้งแรกที่ฉันคิดว่ามันจะทำสิ่งที่แตกต่าง: ย้ายไฟล์สองไฟล์ไปที่อื่น renameผมไม่คิดว่านี่เป็นความคิดที่ดีโดยเฉพาะอย่างยิ่งเนื่องจากมีทางออกที่ดีมากใช้
yo '28

4
@tohecz: ทำไมมันเป็นความลับ? มันเป็นคุณสมบัติของเชลล์และทุกคนสามารถรู้ได้ด้วยการอ่านเชลล์แมนเพจ และฉันไม่คิดว่าrenameเป็นทางออกที่ดีกว่าเพราะrenameอย่าขอให้คุณแทนที่ไฟล์ที่มีอยู่หรือไม่
cuonglm

1
@Gnouc คุณคือผู้ชาย
beginer

20

คุณสามารถใช้rename(ส่วนหนึ่งของแพคเกจ util-linux)

rename .txt .sh ~/folder/subfolder/file.txt

ดูหน้าเปลี่ยนชื่อคนสำหรับรายละเอียดเพิ่มเติม


+1 นี่เป็นวิธีที่ชัดเจนในการทำดีกว่าการใช้{a,b}ฟังก์ชั่นของเชลล์
'28

5
ใน Linux distros บางตัว (เช่น Ubuntu) renameเป็นโปรแกรมแบบ perl-based ที่แตกต่างอย่างสิ้นเชิง rename 's/txt$/sh/' ~/folder/subfolder/file.txtมีคุณจะใช้
evilsoup

บน Debian (และ Ubuntu) ก็มีเช่นmmvกัน
ctrl-alt-delor

10

ทั้งหมดที่กล่าวมาเป็นสิ่งที่ดี สิ่งนี้จะได้ผล:

( cd ~/folder/subfolder && mv file.txt file.sh )

ไม่มันไม่ได้ผลสำหรับฉัน!
Hamed Kamrava

มันจะทำงานถ้าคุณถอดชิ้นsudoส่วนออก
คธูลู

1
@Cululhu ใช่สิทธิ์ของคุณ แต่ทำไมถึงใช้งานไม่ได้sudo?
Hamed Kamrava

2
@HamedKamrava อาจเป็นเพราะsudoมันตีความ~ว่าเป็นโฮมไดเรกทอรีของรูท
คธูลู

คุณสามารถแต่ไม่ ดูว่าทำไม cd เป็นเปลือกที่สร้างขึ้นในและคุณไม่สามารถ.sudomvcdsudo(
Ctrl-Alt-Delor

6

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

cd ~/folder/subfolder/
mv file.txt file.sh

หรือคุณสามารถเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่เปลี่ยนชื่อไฟล์ในไดเรกทอรีเป้าหมาย ตัวอย่างเช่นเพิ่มบรรทัดเหล่านี้ในไฟล์การเริ่มต้นเชลล์ของคุณ ( ~/.bashrcถ้าคุณใช้bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

จากนั้นเปิดเทอร์มินัลใหม่หรือเพียงแค่เรียกใช้source ~/.bashrcเพื่ออ่านไฟล์ init ใหม่และคุณสามารถทำได้:

lmv ~/folder/subfolder/file.txt file.sh

+1 สำหรับlmv()ฟังก์ชั่น ฉันไม่รู้ว่า :)
Hamed Kamrava

1
@HamedKamrava ไม่มีใครรู้ว่ามัน ฉันเพิ่งเขียนมันไม่ได้มาตรฐานอะไร
terdon

2
ฉันรู้ว่า. ฉันหมายความว่าฉันไม่รู้ว่าฉันสามารถเขียนฟังก์ชั่นของตัวเองได้!
Hamed Kamrava

2

เพียงเพื่อขยายประโยชน์ของคำตอบของ cuonglm (เพื่อไม่ให้เครดิตใด ๆ ในขณะที่ฉันรักทางออกของเขา) และคำตอบของเขานั้นถูกต้อง

กรณีการใช้งานคือเรามักจะต้องการ mv ไฟล์ในสถานที่ห่างไกล (ปัญหาจริง) เช่น /folder/subfolder/configFile.dat TO configFile.dat.orig

คำสั่งรูปแบบนี้เพิ่มนามสกุลไฟล์ (ไม่แทนที่นามสกุลเดิม)

mv ~/folder/subfolder/file.txt{,.orig}

อธิบาย: "{, .orig}" หมายถึงแทนที่ (ไม่มี) ในตอนท้ายของชื่อไฟล์ด้วย (อะไร) ".orig"

หรือเพื่อลบนามสกุลไฟล์ (ย้อนกลับเปลี่ยนชื่อ)

mv ~/folder/subfolder/file.txt{.orig,}

หมายเหตุ: ยังอยู่ในหัวข้อ "วิธีที่รวดเร็วที่สุดในการเปลี่ยนชื่อไฟล์โดยไม่ต้องพิมพ์เส้นทาง dir ใหม่"


1

ใช่. ถ้าคุณใช้คุณทำbashsudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd

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


1
จุดประสงค์pushdและpopdที่นี่คืออะไร ดีกว่านี้cd ~/folder/subfolder/ && sudo mv file.txt file.shอย่างไร?
terdon

1
ประเด็นคือคุณอยู่หลังคำสั่งในโฟลเดอร์ที่คุณเริ่มไม่ได้อยู่ในโฟลเดอร์ย่อยใด ๆ ทางเลือกในการpushd popdที่จะใช้และกลับไปกับcd cd -
jofel

ผู้ถามดูเหมือนจะระบุความตั้งใจที่จะไม่เปลี่ยนไดเรกทอรีการทำงานและpopdดีกว่าcd ../../เมื่อมี
41754

7
ใช้(cd /path/to/there && mv x y)ตอนนั้น (พร้อมกับ subshell)
Stéphane Chazelas

คุณจริงๆไม่ควรใส่ก่อนsudo ดังนั้นคำสั่งเต็มรูปแบบที่ควรจะเป็นpushd pushd ...dir && sudo mv old new && popdทางเลือกหนึ่งอาจทำได้(cd ...dir; sudo mv old new)เนื่องจากการทำงานใน subshell จะดูแลการเปลี่ยนแปลงไดเรกทอรีโดยอัตโนมัติ
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.