ฉันรู้วิธีเปลี่ยนชื่อไฟล์ใน Unix:
$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh
^-------this part------^ ^------this part-------^
ใช้เวลานานเกินไปในการทำซ้ำ~/folder/subfolder/file
สองครั้ง
มีวิธีที่เร็วกว่านี้ไหม
ฉันรู้วิธีเปลี่ยนชื่อไฟล์ใน Unix:
$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh
^-------this part------^ ^------this part-------^
ใช้เวลานานเกินไปในการทำซ้ำ~/folder/subfolder/file
สองครั้ง
มีวิธีที่เร็วกว่านี้ไหม
คำตอบ:
ถ้าเปลือกของคุณได้รับการสนับสนุน รั้งการขยายตัว (ทำงานร่วมกับcsh
, tcsh
, ksh
, zsh
, bash
, mksh
, lksh
, pdksh
, yash
กับรั้งขยายเปิดการใช้งานโดยการเรียกyash --brace-expand
หรือตั้งในเปลือก Interative ด้วยset -o brace-expand
หรือfish
):
mv ~/folder/subfolder/file.{txt,sh}
rename
ผมไม่คิดว่านี่เป็นความคิดที่ดีโดยเฉพาะอย่างยิ่งเนื่องจากมีทางออกที่ดีมากใช้
rename
เป็นทางออกที่ดีกว่าเพราะrename
อย่าขอให้คุณแทนที่ไฟล์ที่มีอยู่หรือไม่
คุณสามารถใช้rename
(ส่วนหนึ่งของแพคเกจ util-linux)
rename .txt .sh ~/folder/subfolder/file.txt
ดูหน้าเปลี่ยนชื่อคนสำหรับรายละเอียดเพิ่มเติม
{a,b}
ฟังก์ชั่นของเชลล์
rename
เป็นโปรแกรมแบบ perl-based ที่แตกต่างอย่างสิ้นเชิง rename 's/txt$/sh/' ~/folder/subfolder/file.txt
มีคุณจะใช้
mmv
กัน
ทั้งหมดที่กล่าวมาเป็นสิ่งที่ดี สิ่งนี้จะได้ผล:
( cd ~/folder/subfolder && mv file.txt file.sh )
sudo
ส่วนออก
sudo
?
sudo
มันตีความ~
ว่าเป็นโฮมไดเรกทอรีของรูท
sudo
mv
cd
sudo
(
ไม่คุณต้องให้เส้นทางแบบเต็มไปยังไฟล์เพื่อเปลี่ยนชื่อ ทางเลือกเดียวคือย้ายไปยังโฟลเดอร์เป้าหมายก่อนเรียกใช้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
lmv()
ฟังก์ชั่น ฉันไม่รู้ว่า :)
เพียงเพื่อขยายประโยชน์ของคำตอบของ 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 ใหม่"
ใช่. ถ้าคุณใช้คุณทำbash
sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd
popd
ซึ่งเป็นจริงที่ใหญ่กว่าและอาจล้มเหลวถ้าคุณสูญเสียสิทธิ์การเข้าถึงไดเรกทอรีเดิมเมื่อคุณทำ
pushd
และpopd
ที่นี่คืออะไร ดีกว่านี้cd ~/folder/subfolder/ && sudo mv file.txt file.sh
อย่างไร?
pushd
popd
ที่จะใช้และกลับไปกับcd
cd -
popd
ดีกว่าcd ../../
เมื่อมี
(cd /path/to/there && mv x y)
ตอนนั้น (พร้อมกับ subshell)
sudo
ดังนั้นคำสั่งเต็มรูปแบบที่ควรจะเป็นpushd
pushd ...dir && sudo mv old new && popd
ทางเลือกหนึ่งอาจทำได้(cd ...dir; sudo mv old new)
เนื่องจากการทำงานใน subshell จะดูแลการเปลี่ยนแปลงไดเรกทอรีโดยอัตโนมัติ