Unix: ไฟล์ที่ขึ้นต้นด้วยเส้นประ -


19

ตกลงฉันมีไฟล์เป็นจำนวนมากเริ่มต้นด้วยเส้นประ -. อันไหนไม่ดี ... และฉันต้องการเปลี่ยนชื่อพวกเขา ในกรณีของฉันฉันต้องการใส่ตัวละครต่อหน้าพวกเขา

ฉันพบบรรทัดต่อไปนี้ที่ควรใช้งานได้ แต่เนื่องจากไม่มีการขีด:

for file in -N*.ext; do mv $file x$file; done

ถ้าฉันใส่ echo อยู่ด้านหน้าของ mv ฉันได้รับพวงของ

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

ซึ่งถูกต้องยกเว้นแน่นอนมันจะคิดชื่อไฟล์แรกคือตัวเลือก ดังนั้นเมื่อฉันลบ echo และใช้มันฉันเพิ่งได้รับ

mv: illegal option -- N

ฉันได้ลองเปลี่ยนเป็น

for file in -N*.ext; do mv "$file" "x$file"; done

แต่คำพูดจะถูกละเว้นดูเหมือนว่า พยายามใช้เครื่องหมายคำพูดเดี่ยว แต่ตัวแปรไม่ได้ถูกขยาย ... ฉันจะทำอย่างไร

ปรับปรุง: ตอนนี้ฉันก็พยายามเสนอราคา อย่างนี้:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

และเมื่อฉันสะท้อนสิ่งนั้นมันดูถูกต้อง แต่เมื่อฉันเรียกใช้จริงๆฉันเพิ่งได้รับ

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

ฉันไม่มีเงื่อนงำวิธีการทำตอนนี้ ... ถอนหายใจ


คำตอบ:


26

คุณต้องใช้คำหลัก -- เพื่อบอก mv คำสั่งว่าข้อโต้แย้งจะไม่ถูกตีความว่าเป็นตัวเลือก ดู:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

ใช้ -- หลังจาก ตัวเลือกทั้งหมดใน commandline เช่นถ้าคุณพยายามใช้ -i ตัวเลือกที่จะ mv มันจะไป ก่อน --:

mv -i -- -filename-begins-with-dash newfilename

6
Aaah ไม่ได้คิดเกี่ยวกับสิ่งนั้นเลย ในเวลาที่ฉันพบฉันสามารถติด ./ ต่อหน้าชื่อไฟล์ด้วยซึ่งจะใช้งานได้ แต่นี่เป็นทางเลือกที่ดีกว่า :)
Svish

@Svish: มันยุติธรรมฉันไม่ได้คิดถึงการเตรียมชื่อไฟล์ ./ ทั้ง. แต่คุณก็ถูกต้องแล้วมันก็ใช้ได้เหมือนกันสำหรับสถานการณ์นี้
quack quixote

7
สังเกตได้ว่า -- ความหมายไม่ประมวลผลข้อโต้แย้งเพิ่มเติมเนื่องจากตัวเลือกเป็นแบบแผนและไม่ได้รับความเคารพจากโปรแกรมทั้งหมด บางคนใช้คนเดียว - สำหรับสิ่งนั้นและบางคนไม่ยอมรับ สิ่งใด เพื่อจุดประสงค์นั้น ดังนั้นการเตรียมตัว ./ มีค่าในใจ
dmckee

@dmckee ถูกต้อง; -- เป็นอาร์กิวเมนต์พิเศษคือส่วนขยาย GNU แต่มันถูกกล่าวถึงในแนวทาง POSIX ดูหัวข้อ 12.2 แนวทาง 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... นี่หมายความว่าคุณสามารถคาดหวังได้ว่ายูทิลิตี้ POSIX และ GNU ส่วนใหญ่จะเคารพการประชุม แต่คนอื่นอาจไม่
quack quixote

6

อีกเทคนิคคือการรวมไดเรกทอรีหลักด้วยชื่อไฟล์ ...

ในการเปลี่ยนชื่อไฟล์ '-file-to-rename' เป็น 'file-to-rename' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

ขอบคุณ @Skippy le Grand Gourou ยืนยันว่า ./-file-to-rename ทำงานร่วมกับ mv และ rm ในขณะที่ ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

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