Karakter apa yang aman dalam nama file lintas-platform untuk Linux, Windows dan OS-X

60

Saat ini, saya menggunakan YYMMDD-NAME+PAGEnama untuk sebagian besar file saya. NAMEmemiliki ruang yang dikonversi ke garis bawah.

Saya ingin menggunakan YYYY-MM-DDformat tanggal, tetapi saya tidak yakin bagaimana memisahkannya dari namanya. A -akan terlihat aneh jika namanya dimulai dengan angka. Jika saya menggunakan _, maka konflik dengan garis bawah mewakili ruang.

Karakter apa yang cukup aman dalam nama file yang akan berfungsi di sini? Saya menggunakan Linux, tetapi saya mungkin berbagi file dengan orang lain (Windows 7, Mac OS X).

Martin Ueding
sumber
... di Unix, Windows, dan Amiga 1000?
slhck
Sebagian besar Linux modern.
Martin Ueding
- simbol aman digunakan pada windows 7 .. mungkin sistem operasi modern lainnya melakukan hal yang sama .. Anda dapat menggunakan simbol minus untuk memisahkan ..
Niranjan Singh
kemungkinan duplikat lintas situs: stackoverflow.com/questions/4814040/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

48

Ringkasan:

  • Windows: apa pun kecuali karakter kontrol ASCII dan \/:*?"<>|
  • Linux, OS-X: apa pun kecuali null atau /

Pada semua platform, yang terbaik adalah menghindari karakter yang tidak dapat dicetak seperti karakter kontrol ASCII.

Windows

Di Windows, Windows Explorer tidak memungkinkan karakter kontrol atau \/:*?"<>|Anda dapat menggunakan spasi. Jika Anda menggunakan spasi, Anda harus sering mengutip nama file ketika digunakan dari baris perintah (tapi aplikasi GUI tidak terpengaruh sejauh yang saya tahu). Sistem file Windows seperti NTFS tampaknya menyimpan encoding dengan nama file, tetapi UTF-16 adalah standar.

Beberapa bagian Windows peka huruf besar kecil, bagian lainnya peka huruf besar kecil. Sangat mudah untuk membuat nama file yang berbeda seperti "Ab" dan "ab" pada sistem file Windows NTFS. Nama-nama ini merujuk pada file terpisah yang berisi konten terpisah yang berbeda. Namun, meskipun prompt perintah Windows akan dengan senang hati mendaftarkan kedua file menggunakan dir, Anda tidak dapat dengan mudah mengakses atau memanipulasi salah satu dari mereka menggunakan perintah seperti type. Lihat di bawah.

Linux, OS-X

Di Linux dan OS-X hanya /set ASCII yang dapat dicetak dilarang saya percaya. Beberapa karakter (seperti shell metacharacters *?!) akan menyebabkan masalah pada baris perintah dan akan membutuhkan nama file untuk dikutip atau melarikan diri secara tepat.

Linux filesystems seperti ext2, ext3 adalah agnostik set karakter (saya pikir mereka memperlakukannya lebih atau kurang sebagai aliran byte - hanya null dan /dilarang). Ini berarti Anda dapat menyimpan nama file dalam pengkodean UTF-8. Saya percaya itu tergantung pada shell atau aplikasi lain untuk mengetahui pengkodean apa yang harus digunakan untuk mengkonversi nama file dengan benar untuk ditampilkan atau diproses.

Kesimpulan

Jadi Anda mungkin bisa menggunakan sesuatu seperti (jika tidak terlalu sulit untuk mengetik)


Huruf besar (dalam) sensitivitas pada Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Perhatikan bahwa kita tidak dapat mengetik konten file kedua, typeperintah Windows hanya mengembalikan konten Ab sebagai gantinya. File ketiga akan berbeda dari aB di Linux juga.

(Windows 10 NTFS).

RedGrittyBrick
sumber
1
Semua dalam semua jawaban yang bagus, tapi saya akan menahan diri dari menggunakan nama file di spasi. Melarikan mereka dengan benar dalam semua konteks lebih banyak masalah daripada nilainya. Perhatikan bahwa Microsoft berhenti menggunakan ruang dalam nama direktori sistem. Jika Anda perlu menunjukkan batas kata dalam nama, CamelCase berfungsi dengan baik.
Isaac Rabinovitch
4
"C: \ Program files (x86)" masih ada di Win8 - bukankah itu direktori sistem? Saya setuju bahwa ruang dapat menyebabkan masalah.
RedGrittyBrick
Memang, tapi bisa diubah namanya menjadi apa saja. Tentu saja, banyak program akan panik jika Anda menamainya menjadi "]: \ foobar", tetapi Windows menyebutnya sebagai "% programfiles (x86)%".
Marcks Thomas
2
Sesuatu yang perlu diingat di sini, sistem linux dapat menganggap huruf besar dan kecil sebagai berbeda, sementara Windows menganggapnya sama.
thecoshman
1
Anda akan terkejut betapa banyak program payah dalam parsing. Itu sebabnya tidak ada Windows 9.
Isaac Rabinovitch
46

Sementara jawaban RedGrittyBrick secara teknis benar, keamanan bukan satu-satunya masalah: kegunaan juga penting. Saya pikir pertanyaan yang lebih baik adalah "karakter apa yang baik untuk digunakan dalam nama file".

Beberapa pedoman potensial:

  • [0-9a-zA-Z_] - Karakter alfanumerik dan garis bawah selalu baik untuk digunakan.
  • \/:*?"<>|dan byte nol bermasalah pada setidaknya satu sistem, dan harus selalu dihindari.
  • Spasi digunakan sebagai pemisah argumen pada banyak sistem, jadi nama file dengan spasi harus dihindari bila memungkinkan. Spasi putih lain (misalnya tab) bahkan lebih.
  • Titik koma (;) digunakan untuk memisahkan perintah pada banyak sistem. Tanda koma dan koma (,) digunakan untuk memisahkan argumen baris perintah pada (beberapa versi?) Baris perintah windows.
  • []()^ #%&!@:+={}'~dan [`] semuanya memiliki arti khusus dalam banyak shell, dan menjengkelkan untuk dikerjakan, dan karenanya harus dihindari. Mereka juga cenderung terlihat mengerikan di URL .
  • Karakter utama yang harus dihindari:
    • Banyak program baris perintah menggunakan tanda hubung [-] untuk menunjukkan argumen khusus.
    • * Sistem berbasis nix menggunakan full-stop [.] sebagai karakter utama untuk file dan direktori tersembunyi.
  • Apa pun yang tidak ada dalam rangkaian ASCII dapat menyebabkan masalah pada sistem yang lebih lama atau lebih mendasar (mis. Beberapa sistem tertanam), dan harus digunakan dengan hati-hati.

Itu pada dasarnya membuat Anda:

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

yang selalu aman dan tidak mengganggu untuk digunakan (selama Anda memulai nama file dengan alpha-numeric) :)

tidak ada apa-apa101
sumber
1
Kawat gigi ( []) adalah bagian dari ekspresi reguler dan memiliki makna khusus di shell juga. Tetapi mereka tidak seburuk itu untuk bekerja kecuali beberapa kasus sudut kejahatan.
Martin Ueding
1
Hrm ... Saya kira hal yang sama bisa dikatakan tentang (), sebenarnya.
nucky101
4
Di zsh, karakter yang mungkin ditafsirkan berbeda termasuk []()^;, jadi saya pikir jawaban yang tepat mungkin benar-benar [0-9a-zA-Z.,_-]koma juga bisa dikecualikan hanya karena itu aneh untuk melihat dalam nama file, meskipun saya tidak bisa memikirkan kasus aktual di mana ia akan menyebabkan masalah.
Casey Rodarmor
ya, saya menghapusnya dari daftar terakhir
naught101
1
koma bisa mengganggu, coba echo whereami > a,b,cdi jendela command prompt Win10.
RedGrittyBrick
4

Anda bisa:

  1. ganti garis bawah saat ini dengan #(simbol proofreader untuk spasi)
  2. garis bawahi ke tanggal 'bagian' dari nama file (atau tanda hubung kedua - lebih mudah untuk mengetik)

Alt-1. cap awal dapat menggantikan spasi: YYMMDD-HHMM-FileName.extatauYYMMDD-HHMM_FileName.ext

Karakter minimal untuk tampilan jernih, yang secara otomatis menyortir dengan angka nol untuk Jan-Sep (& 1st-9th ea mo).

tb01
sumber