ถูกต้องหรือไม่ที่จะใช้อักขระพิเศษบางตัวเมื่อตั้งชื่อไฟล์ใน Linux?


18

มันถูกต้องที่จะใช้ตัวอักษรพิเศษบางอย่างเช่น+, &, ', .(dot) และ,(จุลภาค) โดยทั่วไปในชื่อไฟล์

ฉันเข้าใจว่าคุณสามารถใช้-และ_ไม่มีปัญหา แต่การทำวิจัยบางอย่างฉันไม่สามารถหาสิ่งที่แน่นอนเกี่ยวกับสัญลักษณ์อื่น ๆ ; บางคนบอกว่าคุณทำได้บางคนบอกว่าคุณทำไม่ได้และบางคนบอกว่ามันเป็น "ไม่สนับสนุน" ให้ใช้มัน


คุณใช้โปรแกรมอะไรในการทำงานกับไฟล์เหล่านี้ เฉพาะโปรแกรมที่ตีความอักขระบางตัวด้วยวิธีพิเศษ (เช่น shells บนสตริงที่ไม่ได้ใส่เครื่องหมายคำพูด) เท่านั้นที่จะทำให้เกิดปัญหา โปรแกรม C เฉลี่ยของคุณใช้ทุกสิ่งที่ไม่ใช่ NUL โดยไม่ต้องกระพริบตา
Anthon

9
คุณหมายถึงอะไร "ถูกต้อง"?
David Richerby

ปัญหาของการใช้อักขระพิเศษในชื่อไฟล์คือการเพิ่มโอกาสที่รหัสชิ้นเล็ก ๆ บางอย่างอาจทำให้ชื่อไฟล์ผิดไป อย่างไรก็ตามฉันไม่คิดว่าตัวละครที่คุณระบุมีแนวโน้มที่จะก่อให้เกิดปัญหาใด ๆ คุณจะมีปัญหามากขึ้นด้วยช่องว่างซึ่งทั่วไปควรหลีกเลี่ยง และ EOL โดยเฉพาะควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด

Windowsมีข้อ จำกัด ที่เข้มงวดเกี่ยวกับสิ่งที่อาจเป็นชื่อไฟล์ดังนั้นหากมีโอกาสที่จะต้องใช้ไฟล์ที่นั่นนั่นเป็นสิ่งที่ควรคำนึงถึง
evilsoup

คำตอบ:


28

การใช้อักขระพิเศษบางตัวเป็น +, &, ', ถูกต้องหรือไม่ (จุด) และ (จุลภาค) โดยทั่วไปในชื่อไฟล์

ใช่.

ถูกต้อง แต่ไม่จำเป็นต้องแนะนำหรือสะดวก

คุณสามารถใช้อักขระใดก็ได้ยกเว้น null และ/ ภายในชื่อไฟล์ในระบบไฟล์ Unix และ Linux ที่ทันสมัย

คุณสามารถใช้เครื่องหมายวรรคตอน ASCII ยูทิลิตี้บางอย่างใช้หยุด ( จุด ) และเครื่องหมายจุลภาคในชื่อของไฟล์ที่พวกเขาสร้าง

คุณสามารถใช้อักขระควบคุม ASCII ได้อย่างไรก็ตามนี่เป็นสิ่งที่ไม่เหมาะสมเนื่องจากไม่น่าจะแสดงได้อย่างน่าเชื่อถือและใช้งานยาก

คุณสามารถใช้อักขระ meta-shellเช่น ASCII ampersand และ ASCII apostrophe อย่างไรก็ตามสิ่งนี้ไม่สะดวกและต้องการให้เมื่อสร้างคำสั่งคุณต้องใช้ความระมัดระวังเป็นพิเศษในการอ้างอิงหรือหลีกเลี่ยงตัวละครดังกล่าว

คุณสามารถใช้อักขระหลายไบต์ได้โดยใช้การเข้ารหัสที่หลากหลาย มันขึ้นอยู่กับเชลล์และ / หรือยูทิลิตี้เพื่อตีความและแสดงอักขระที่ไม่ใช่ ASCII อย่างถูกต้อง ขอแนะนำให้ จำกัด การเข้ารหัสของคุณเช่น UTF-8 และตั้งค่าภาษาให้เหมาะสม

คุณจะมีปัญหาน้อยที่สุดในการใช้อักขระที่พิมพ์ได้ของ ASCII การ จำกัด ชุดอักขระเครื่องหมายวรรคตอนให้กับอักขระที่ไม่ใช่อักขระ meta-shell และไม่เริ่มต้นชื่อด้วยเครื่องหมายขีดคั่น (หรือหยุด - ยกเว้นว่าคุณต้องการซ่อนไฟล์)


23

ดังที่คนอื่น ๆ ได้กล่าวไว้ในระบบ Unix / Linux ที่ทันสมัยชื่อไฟล์สามารถมีอักขระใด ๆ ยกเว้น\0(NUL) และ/(สแลช)

นอกจากนั้นมาตรฐาน POSIX จะกำหนดชุดอักขระแบบพกพาสำหรับชื่อไฟล์:

3.278 ชุดตัวอักษรชื่อไฟล์พกพา

ชุดของอักขระที่สร้างชื่อไฟล์แบบพกพา

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

อักขระสามตัวสุดท้ายคือ <period>, <underscore> และ <hyphen> ตัวอักษรตามลำดับ ดูที่Pathnameด้วย

pathchkยูทิลิตี้จากGNU coreutilsตรวจสอบนี้เมื่อเรียกว่ามี-pตัวเลือกและ-Pตัวเลือกที่จะเตือนเกี่ยวกับชื่อไฟล์ที่ว่างเปล่า (ซึ่งไม่ถูกต้อง แต่อาจจะส่งผ่านเป็นอาร์กิวเมนต์ไปยังpathchk) และชื่อไฟล์ที่เริ่มต้นด้วยยัติภังค์ ( -)


9

เดิมพันที่ปลอดภัยที่สุดคือการอ้างถึงรายการ wikipedia สำหรับชุดอักขระที่อนุญาตสำหรับระบบปฏิบัติการใด ๆ มันสามารถพบได้จากที่นี่

ตัวอย่างเช่นสำหรับระบบที่ใช้ระบบปฏิบัติการยูนิกซ์ส่วนใหญ่ชุดอักขระที่อนุญาตคือชุด 8 บิตและอักขระที่สงวนไว้คืออักขระ null (NUL, '\0') อย่างไรก็ตามการใช้อักขระพิเศษในชื่อไฟล์นั้นไม่ใช่วิธีปฏิบัติที่ดีเนื่องจากมีปัญหาขณะถอดออก

ตัวอย่างเช่นฉันสามารถมีชื่อไฟล์เป็น-ramesh.txtและฉันพยายามลบมันดังต่อไปนี้

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

ฉันต้องลบไฟล์เป็น

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

รายละเอียดเพิ่มเติมสามารถพบได้จากคำตอบนี้เช่นกัน

ใน Linux และ OS-X /ของชุด ASCII ที่พิมพ์ได้นั้นเป็นสิ่งต้องห้ามฉันเชื่อว่า อักขระบางตัว (เชลล์เมตาอักขระเช่น*?!) จะทำให้เกิดปัญหาในบรรทัดคำสั่งและจะต้องใช้ชื่อไฟล์ที่จะยกมาหรือหนีอย่างเหมาะสม

ระบบไฟล์ Linux เช่น ext2, ext3 เป็นตัวละครที่ไม่เชื่อเรื่องพระเจ้า (ฉันคิดว่าพวกเขาปฏิบัติต่อมันมากขึ้นหรือน้อยลงเป็นสตรีมไบต์ - เป็นโมฆะเท่านั้นและ/ไม่ได้รับอนุญาต) ซึ่งหมายความว่าคุณสามารถจัดเก็บชื่อไฟล์ในการเข้ารหัส UTF-8 ฉันเชื่อว่ามันขึ้นอยู่กับเชลล์หรือแอปพลิเคชั่นอื่น ๆ ที่จะรู้ว่าการเข้ารหัสเพื่อใช้ในการแปลงชื่อไฟล์สำหรับการแสดงหรือการประมวลผลอย่างเหมาะสม

เพื่อสรุปปัญหาไม่ได้อยู่ในการใช้อักขระพิเศษสำหรับชื่อไฟล์ แต่ในวิธีการจัดการพวกเขา


ด้วยเหตุผลดังกล่าว ("วิธีจัดการกับพวกเขา") ฉันเกือบจะใช้ตัวอักษรตัวเลขเครื่องหมายขีดล่างและจุดเท่านั้นถ้าทำให้ชีวิตของฉันง่ายขึ้นเมื่อฉันตัดสินใจในภายหลังฉันต้องใช้โปรแกรมบรรทัดคำสั่งเพื่อทำสิ่งต่าง ๆ กับไฟล์ของฉัน (ซึ่งดูเหมือนว่าจะเกิดขึ้นอย่างน้อยหนึ่งครั้ง)
phyrfox

19
ไม่สนับสนุนชื่อไฟล์ที่ขึ้นต้นด้วย-แต่ต้องแม่นยำ: 1) คุณไม่จำเป็นต้องใส่เครื่องหมายคำพูดรอบชื่อไฟล์นี้ 2) แทนที่จะใช้--อาร์กิวเมนต์พิเศษคุณอาจทำตามที่rmตัวเองแนะนำ: rm ./-ramesh.txtดังนั้นคุณไม่จำเป็นต้องทำมัน ตรงตามที่คุณแนะนำ
Michał Politowski

@ MichałPolitowskiไม่เพียง แต่คุณไม่จำเป็นต้องใส่เครื่องหมายคำพูดเท่านั้น
ctrl-alt-delor

4

งานวิจัยของคุณเกือบจะถูกต้องแล้ว เป็นไปได้ที่จะใช้อักขระพิเศษในชื่อไฟล์ แต่ไม่แนะนำให้เลือกเนื่องจากอักขระเหล่านี้มีความหมายพิเศษ อนุสัญญาการตั้งชื่อไฟล์ใน Linuxอธิบายข้อ จำกัด อื่น ๆ เกี่ยวกับชื่อไฟล์เช่น "ชื่อไฟล์ไม่ควรเริ่มต้นด้วยเครื่องหมายขีดคั่น"

ตัวอย่างง่ายๆของการดำเนินการของบรรทัดคำสั่งด้วยอักขระพิเศษในชื่อไฟล์

ในฐานะบันทึกส่วนตัวฉันควรหลีกเลี่ยงอักขระพิเศษในชื่อไฟล์เพราะต้องการความสนใจเป็นพิเศษเมื่อใช้ไฟล์เหล่านี้สำหรับการประมวลผลใด ๆ ดังนั้นการขจัดความกังวลในการจัดการกับตัวละครพิเศษจากกระบวนการพัฒนา


1
ดังนั้นคำแนะนำของคุณจะใช้เพียง-, _และ.(dot) ในชื่อไฟล์?
Chris Klein

@ChrisKlein, อ๋อ แต่ไม่ใช่ในตอนต้นของชื่อไฟล์
Simply_Me

ความหมายพิเศษอยู่ในโปรแกรม (เช่นเชลล์ของคุณ) ไม่ใช่ชื่อไฟล์ โปรแกรมเกือบทั้งหมดใน U&L ไม่สนใจตัวละครเลยตราบใดที่ไม่มี NUL ในชื่อไฟล์
Anthon

@Athon ใช่เปลือกของฉันตามที่อธิบายไว้ในลิงค์
Simply_Me

2
ในฐานะบันทึกส่วนตัวฉันขอแนะนำให้นักพัฒนาตั้งชื่อโฟลเดอร์หลักของโครงการเช่น "föλder \ t☃" - เพื่อให้พวกเขาสังเกตเห็นได้ทันทีว่าพวกเขาทำข้อผิดพลาดที่แตกในชื่อไฟล์ดังกล่าวแทนที่จะเผยแพร่รหัสที่ขาดหรือไบนารี ที่คนอื่นต้องทำงาน การใช้มันไม่ใช่ปัญหาตราบใดที่มันเป็นแท็บเดียวที่ขึ้นต้นด้วย 'f' การเติมแท็บในเชลล์ใด ๆ จะเข้าสู่สิ่งที่ยากต่อการพิมพ์
Peteris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.