อักขระใดบ้างที่ปลอดภัยในชื่อไฟล์ข้ามแพลตฟอร์มสำหรับ Linux, Windows และ OS-X


60

ปัจจุบันฉันใช้YYMMDD-NAME+PAGEชื่อสำหรับไฟล์ส่วนใหญ่ของฉัน NAMEมีการแปลงช่องว่างเป็นขีดล่าง

ฉันต้องการใช้YYYY-MM-DDรูปแบบวันที่ แต่ฉันไม่แน่ใจว่าจะแยกมันออกจากชื่ออย่างไร A -จะดูแปลก ๆ ถ้าชื่อเริ่มต้นด้วยตัวเลข ถ้าฉันใช้ a _มันจะขัดแย้งกับขีดล่างที่แทนช่องว่าง

อักขระใดที่ปลอดภัยพอสมควรในชื่อไฟล์ที่จะใช้งานได้ที่นี่ ฉันอยู่บน Linux แต่ฉันอาจแชร์ไฟล์กับผู้อื่น (Windows 7, Mac OS X)


…บน Unix, Windows, Amiga 1,000?
slhck

Linux ที่ทันสมัยเป็นส่วนใหญ่
Martin Ueding

- สัญลักษณ์มีความปลอดภัยในการใช้งานบน windows 7 .. อาจเป็นระบบปฏิบัติการที่ทันสมัยอื่น ๆ เช่นเดียวกัน .. คุณสามารถใช้สัญลักษณ์ลบเพื่อแยก ..
Niranjan Singh เมื่อ

เป็นไปได้ที่ซ้ำกันข้ามไซต์ของ: stackoverflow.com/questions/4814040/...
Ciro Santilli新疆改造中心法轮功六四事件

คำตอบ:


48

สรุป:

  • Windows: ทุกอย่างยกเว้นอักขระควบคุมของ ASCII และ \/:*?"<>|
  • Linux, OS-X: อะไรก็ได้ยกเว้น null หรือ /

ในทุกแพลตฟอร์มคุณควรหลีกเลี่ยงอักขระที่ไม่สามารถพิมพ์ได้เช่น ASCII control-characters

ของ windows

ใน Windows Windows Explorer ไม่อนุญาตให้ใช้อักขระควบคุมหรือ\/:*?"<>|คุณสามารถใช้ช่องว่างได้ หากคุณใช้ช่องว่างคุณมักจะต้องอ้างชื่อไฟล์เมื่อใช้จากบรรทัดคำสั่ง (แต่แอป GUI ไม่ได้รับผลกระทบเท่าที่ฉันรู้) ระบบไฟล์ของ Windows เช่น NTFS เห็นได้ชัดว่าการเข้ารหัสด้วยชื่อไฟล์ แต่ UTF-16 เป็นมาตรฐาน

บางส่วนของ Windows คำนึงถึงขนาดตัวพิมพ์และส่วนอื่น ๆ ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก มันง่ายที่จะสร้างชื่อไฟล์ที่แตกต่างเช่น "Ab" และ "ab" บนระบบไฟล์ Windows NTFS ชื่อเหล่านี้อ้างถึงไฟล์แยกต่างหากซึ่งมีเนื้อหาแยกต่างหากที่แตกต่างกัน อย่างไรก็ตามแม้ว่าของ Windows พร้อมรับคำสั่งอย่างมีความสุขจะมีรายการทั้งสองไฟล์โดยใช้คุณจะไม่สามารถเข้าถึงได้อย่างง่ายดายหรือจัดการหนึ่งของพวกเขาโดยใช้คำสั่งเช่นdir typeดูด้านล่าง

Linux, OS-X

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

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

ข้อสรุป

ดังนั้นคุณอาจใช้สิ่งที่ปลอดภัยได้(ถ้าพิมพ์ไม่ยาก)


ความไวตัวพิมพ์เล็ก - ใหญ่ (in) ใน Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

โปรดทราบว่าเราไม่สามารถพิมพ์เนื้อหาของไฟล์ที่สองtypeคำสั่งWindows เพิ่งส่งคืนเนื้อหาของ Ab แทน ไฟล์ที่สามจะแตกต่างจาก aB บน Linux เช่นกัน

(Windows 10 NTFS)


1
ทั้งหมดในคำตอบที่ดี แต่ฉันละเว้นจากการใช้ชื่อไฟล์ในช่องว่าง การหลบหนีอย่างถูกต้องในทุกบริบทเป็นปัญหามากกว่าที่ควรจะเป็น ขอให้สังเกตว่า Microsoft หยุดใช้พื้นที่ในชื่อไดเรกทอรีระบบ หากคุณต้องการระบุขอบเขตของคำในชื่อ CamelCase ก็ใช้ได้ดี
Isaac Rabinovitch

4
"C: \ Program files (x86)" ยังคงมีอยู่ใน Win8 - นั่นไม่ใช่ไดเรคทอรีระบบใช่หรือไม่ ฉันยอมรับว่าช่องว่างอาจทำให้เกิดปัญหาได้
RedGrittyBrick

มันเป็น แต่มันสามารถเปลี่ยนชื่อเป็นอะไรที่สวยมาก แน่นอนโปรแกรมจำนวนมากจะประหลาดถ้าคุณเปลี่ยนชื่อเป็น "]: \ foobar" แต่ Windows อ้างถึงมันเป็น "% programfiles (x86)%"
Marcks โทมัส

2
สิ่งที่ต้องคำนึงถึงจริงๆที่นี่ระบบ linux สามารถพิจารณาตัวพิมพ์ใหญ่และตัวพิมพ์เล็กได้อย่างชัดเจนในขณะที่ Windows ถือว่าพวกเขาเหมือนกัน
thecoshman

1
คุณจะประหลาดใจที่มีหลายโปรแกรมที่แยกวิเคราะห์ นั่นเป็นสาเหตุที่ไม่มี Windows 9
Isaac Rabinovitch

46

ในขณะที่คำตอบของ RedGrittyBrick นั้นถูกต้องทางเทคนิคความปลอดภัยไม่ใช่ปัญหาเดียว: การใช้งานก็สำคัญเช่นกัน ฉันคิดว่าคำถามที่ดีกว่าคือ "ตัวละครที่ดีควรใช้ในชื่อไฟล์"

แนวทางที่เป็นไปได้บางประการ:

  • [0-9a-zA-Z_] - ตัวอักษรและตัวเลขและเครื่องหมายขีดล่างมักใช้งานได้ดี
  • \/:*?"<>|และไบต์โมฆะมีปัญหาในระบบอย่างน้อยหนึ่งและควรเสมอที่จะหลีกเลี่ยง
  • ช่องว่างถูกใช้เป็นตัวคั่นอาร์กิวเมนต์ในหลาย ๆ ระบบดังนั้นชื่อไฟล์ที่มีช่องว่างควรหลีกเลี่ยงเมื่อเป็นไปได้ ช่องว่างอื่น ๆ (เช่นแท็บ) มากยิ่งขึ้น
  • อัฒภาค (;)ใช้เพื่อแยกคำสั่งในหลาย ๆ ระบบ ใช้เครื่องหมายอัฒภาคและเครื่องหมายจุลภาค (,)เพื่อแยกอาร์กิวเมนต์บรรทัดคำสั่งบน(บางเวอร์ชัน)?บรรทัดคำสั่ง windows
  • []()^ #%&!@:+={}'~และ[`]ทุกคนมีความหมายพิเศษในเปลือกหอยจำนวนมากและน่ารำคาญที่จะหลีกเลี่ยงและควรหลีกเลี่ยง พวกเขายังมีแนวโน้มที่จะดูน่ากลัวในส่วนของ URL
  • ตัวละครนำที่ควรหลีกเลี่ยง:
    • โปรแกรมบรรทัดคำสั่งจำนวนมากใช้เครื่องหมายขีดคั่น [-]เพื่อระบุอาร์กิวเมนต์พิเศษ
    • * ระบบที่ใช้ nix ใช้full-stop [.]เป็นอักขระนำสำหรับไฟล์และไดเร็กทอรีที่ซ่อน
  • สิ่งใดที่ไม่อยู่ในชุด ASCIIอาจทำให้เกิดปัญหากับระบบเก่าหรือระบบพื้นฐานอื่น ๆ (เช่นระบบฝังตัวบางตัว) และควรใช้ด้วยความระมัดระวัง

โดยพื้นฐานแล้วคุณจะได้รับ:

[0-9a-za-Z -._]

ที่ปลอดภัยเสมอและไม่น่ารำคาญที่จะใช้ (ตราบใดที่คุณเริ่มต้นชื่อไฟล์ด้วยตัวเลขและตัวอักษร) :)


1
เครื่องหมายวงเล็บ ( []) เป็นส่วนหนึ่งของนิพจน์ทั่วไปและมีความหมายพิเศษในเชลล์เช่นกัน แต่พวกเขาก็ไม่ได้เลวร้ายเท่าที่จะทำงานด้วยยกเว้นบางกรณีมุมที่ชั่วร้าย
Martin Ueding

1
อืม ... ฉันเดาว่าคงพูดแบบเดียวกันได้()จริง
naught101

4
ใน zsh ตัวละครที่อาจถูกตีความแตกต่างกันรวมถึง[]()^;ดังนั้นฉันคิดว่าคำตอบที่ถูกต้องอาจเป็น[0-9a-zA-Z.,_-]เครื่องหมายจุลภาคอาจถูกแยกออกเพียงเพราะมันแปลกที่จะเห็นในชื่อไฟล์ถึงแม้ว่าฉันจะไม่นึกถึงกรณีที่เกิดขึ้นจริง ปัญหาที่เกิดขึ้น
Casey Rodarmor

ใช่ฉันลบพวกเขาจากรายการสุดท้าย
naught101

1
เครื่องหมายจุลภาคอาจน่ารำคาญลองecho whereami > a,b,cในหน้าต่างพร้อมรับคำสั่ง Win10
RedGrittyBrick

4

คุณสามารถ:

  1. แทนที่ขีดล่างปัจจุบันด้วย#(สัญลักษณ์ของผู้พิสูจน์อักษรสำหรับพื้นที่)
  2. ขีดล่างเป็นวันที่ 'ส่วน' จากชื่อไฟล์ (หรือยัติภังค์ที่สอง - พิมพ์ได้ง่ายกว่า)

Alt-1 ตัวพิมพ์ใหญ่สามารถแทนที่ช่องว่าง: YYMMDD-HHMM-FileName.extหรือYYMMDD-HHMM_FileName.ext

ตัวอักษรน้อยที่สุดสำหรับการแสดงผลที่ชัดเจนซึ่งจัดเรียงอัตโนมัติด้วยเลขศูนย์สำหรับมกราคม - กันยายน (และวันที่ 1-9th)

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