จะเปลี่ยนชื่อไฟล์ภายในโฟลเดอร์โดยใช้คำสั่ง shell ได้อย่างไร?


8

some/long/path/to/file/myfiel.txtฉันมีไฟล์ที่

some/long/path/to/file/myfile.txtฉันต้องการที่จะเปลี่ยนชื่อเป็น

ขณะนี้ฉันทำได้โดยmv some/long/path/to/file/myfiel.txt some/long/path/to/file/myfile.txtแต่การพิมพ์เส้นทางสองครั้งไม่มีประสิทธิภาพมากนัก (แม้จะเสร็จสิ้นการแท็บ)

ฉันจะทำสิ่งนี้เร็วขึ้นได้อย่างไร (ฉันคิดว่าฉันสามารถเขียนฟังก์ชันเพื่อเปลี่ยนเซ็กเมนต์ชื่อไฟล์เท่านั้น แต่นั่นคือแผน B)

คำตอบ:


11

หากต้องการทำสิ่งนี้ในคำสั่งเดียวคุณสามารถทำสิ่งนี้ได้:

mv some/long/path/to/file/{myfiel.txt,myfile.txt}

ซึ่งเป็นตัวอย่างสำหรับชื่อไฟล์แบบเต็มเนื่องจากเป็นตัวพิมพ์ใหญ่ที่คุณสามารถทำสิ่งต่อไปนี้

mv some/long/path/to/file/myfi{el,le}.txt

ทั้งสองจะขยายไปยังคำสั่งเต็มรูปแบบเหล่านี้จะเรียกว่าการขยายรั้ง พวกเขาจะได้รับการสนับสนุนโดย zsh


โอ้นี่มันเปิดโอกาสให้มากมาย ขอบคุณ!
Leonid Shevtsov

5

นี่คือตัวเลือกต่างๆ:

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

cd /home/long/path
mv file1 file2
cd -

เปลี่ยนไดเรกทอรีโดยใช้ไดเรกทอรีสแต็ค:

pushd /some/long/path
mv file1 file2
popd

เปลี่ยนเป็นไดเร็กทอรีโดยใช้เชลล์ย่อย:

( 
  cd /some/long/path
  mv file1 file2
)   # no need to change back

ใช้การขยายรั้ง:

mv /some/long/path/{file1,file2}

ใช้ตัวแปร:

D=/some/long/path
mv "$D/file1" "$D/file2"

ระวังว่าวิธีการสุดท้ายจะหยุดเมื่อเส้นทางมีช่องว่าง
slhck

@slhck ทั้งหมดของวิธีการแบ่งถ้าคุณมีช่องว่าง
tylerl

1
ไม่ถ้าคุณพิมพ์อย่างถูกต้องพวกเขาจะไม่ เฉพาะตัวแปรเมื่อขยายเท่านั้นที่จะดูเหมือนหลายอาร์กิวเมนต์ของ mv
slhck

@slhck ไปแล้ว
tylerl

3

เปลี่ยนเป็นไดเร็กทอรีย้ายไฟล์และเปลี่ยนกลับไปเป็นไดเร็กทอรีก่อนหน้า ชอบมาก:

cd some/long/path/to/file
mv myfiel.txt myfile.txt
cd -

1

เมื่อฉันใช้วิธีการ subshell ฉันมักจะทำมันในหนึ่งบรรทัดเช่นนั้น

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