การเปลี่ยนชื่อไฟล์ที่มีเครื่องหมายคำพูด 'ในชื่อ


11

ฉันมีปัญหาเล็กน้อย ไคลเอนต์หนึ่งมอบหมายให้ฉันย้ายเว็บไซต์จากเซิร์ฟเวอร์เก่าจริง ๆ ไม่ทราบว่าพวกเขาไปถึงที่นั่นได้อย่างไร แต่มีไฟล์'อยู่ในชื่อของพวกเขา มีวิธีการเปลี่ยนชื่อไฟล์หรือไม่? mvดูเหมือนจะไม่ทำเคล็ดลับ

ls แสดงให้เห็นว่าเป็น 90843_O\\'ConnorPaul_GeneralManager.jpg

เมื่อฉันลอง

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

มันไม่ทำอะไรเลยกับ>ในบรรทัดใหม่ราวกับว่ากำลังรอการป้อนข้อมูลเพิ่มเติม

ถ้าฉันลอง

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

ฉันได้รับข้อผิดพลาด

mv: ไม่สามารถสถิติ '90843_O \' ConnorPaul_GeneralManager.jpg ': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

นอกจากนี้ยังจะมีวิธีง่าย ๆ ที่จะเปลี่ยน\'ไป_ในไฟล์ทั้งหมดในโฟลเดอร์บาง?


1
หากคุณมีมากกว่านั้นมันvidirเป็นวิธีแก้ไขปัญหาประเภทนี้ได้ง่าย
Derobert

คำตอบ:


6

การเติมแท็บ Bash ควรจะทำสิ่งที่ถูกต้องได้ที่นี่ถ้าคุณแค่พิมพ์mv 90843_Oและกด tab มิฉะนั้นวิธีหนึ่งในการหลีกเลี่ยงชื่ออย่างถูกต้องคือ:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

เครื่องหมายคำพูดคู่นำความจำเป็นในการหลบหนีออก'แต่อักขระแบ็กสแลชสองตัวยังคงต้องมีการหลบหนี ตัวเลือกอื่นคือ:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

นี่คือการวางทับขวาในราคาเดียวลบที่ต้องหลบหนีพวกเขา 'แต่คุณจำเป็นต้องจบคำพูดเดียวที่จะเพิ่มตัวอักษร นี่คือการหลีกเลี่ยงหลังจากจบคำพูด

โปรดทราบว่าปัญหานี้มีความเกี่ยวข้องกับการมีเครื่องหมายแบ็กสแลชในชื่อเหมือนกับเครื่องหมายคำพูดเดี่ยว ในการแทนที่\\'ลำดับ (เนื่องจากมีแบ็กสแลชสองตัวในชื่อไฟล์ในคำถามทั้งคู่จะทำให้เกิดปัญหา) ด้วยการขีดเส้นใต้สำหรับไฟล์ทั้งหมดในไดเรกทอรีโดยใช้ลูป:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

-iจะทำให้mvพรอมต์หากไฟล์ใด ๆ จะถูกเขียนทับ การใช้prename( renameลิงก์ไปยังสิ่งนี้ในหลาย ๆ ระบบ):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

ลบ-nเมื่อคุณมีความสุขจะทำสิ่งที่คุณต้องการ โปรดทราบว่าอักขระเครื่องหมายแบ็กสแลชควรหลีกเลี่ยงภายในนิพจน์ Perl ที่นี่แม้ว่าจะมีเครื่องหมายคำพูดเดี่ยวล้อมรอบพวกเขา (หากไม่มีเครื่องหมายคำพูดเดี่ยวคุณจะต้องมีเครื่องหมายแบ็กสแลชแปดตัวเนื่องจากเชลล์จะถูกลบออกสี่ตัว


4

คุณสามารถใช้renameสำหรับงานดังกล่าว:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

หากคุณต้องการที่จะเปลี่ยน'สำหรับ_คุณยังสามารถใช้เปลี่ยนชื่อ:

rename "s/\'/_/g" *

-2

Grrr, @Graeme ทุบตีฉัน แต่ฉันจะโพสต์ต่อไป ...

หากคุณอ้างชื่อไฟล์ด้วยเครื่องหมายคำพูดคู่เช่นmv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpgจะเป็นการหลอกลวง ใช้-vเป็นตัวเลือก แต่มันจะบอกว่ามันทำอะไร ฉันเชื่อว่ามีวิธีที่สองนอกเหนือจากการหลบหลีก chars ทั้งหมด - ถ้าเป็นไปได้ ข้อเสียเพียงอย่างเดียวที่ฉันรู้ในวิธีนี้คือเชลล์จะประมวลผลข้อความเนื่องจากไม่ได้อยู่ในเครื่องหมายคำพูดเดี่ยว แต่มันไม่ได้จัดการอะไรเลยเนื่องจากไม่ใช่รหัสภายในและเวลาเพิ่มเติมที่ใช้ในการประมวลผลนั้นไม่มีความหมาย

เพิ่งผ่านการทดสอบคุณสามารถมีลักษณะเหมือนถ่าน>ภายในข้อความที่ยกมาสองครั้งและมันจะถูกนำมาเป็นส่วนหนึ่งของชื่อไฟล์

ในฐานะที่เป็นเคล็ดลับสำหรับอนาคตที่คุณสามารถใช้./ขวาก่อนที่ชื่อไฟล์ถ้ามันจะช่วยให้ปัญหาเช่นไฟล์ที่เริ่มต้นด้วยเส้นประ: mv ./-file fileจะเปลี่ยนชื่อไป-file fileในกรณีเช่นนี้คุณไม่สามารถอ้างอิงหรือยกเว้นชื่อไฟล์ได้ยกเว้น

ผิดปกติพอฉันสามารถสร้างไฟล์ได้90843_O'ConnorPaul_GeneralManager.jpgถ้าฉันหนีจากเครื่องหมายคำพูดเดียว\'แต่มันจะไม่สร้างถ้ามันไม่ได้ยกมาสองครั้งหรือหนี

PS: การทุบตีเสร็จสิ้นเป็นอีกวิธีหนึ่งมันแก้ไขปัญหาชื่อไฟล์ด้วยไฟล์ของคุณ แต่มันจะไม่ทำงานกับไฟล์ / โฟลเดอร์ "เส้นประ" เพียงแค่เขียนส่วนหนึ่งของชื่อและกด Tab ก็จะจัดการส่วนที่เหลือ


ทำไมต้องลงคะแนน ฉันเขียนต่อหน้าคนอื่น แต่ฉันก็ยังไม่เร็วพอที่จะโพสต์ก่อนได้
rautamiekka

ไม่ใช่ฉัน เงื่อนงำที่ลงคะแนนไม่
Igor Yavych

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