Nama file Linux / Windows / Unix / ...: Karakter apa saja yang diperbolehkan? Mana yang tidak terhindar?

43

Karakter mana yang diperbolehkan dan yang mana dari mereka harus diloloskan pada baris perintah di sistem operasi yang berbeda?

java.is.for.desktop
sumber
Ada beberapa jawaban yang berguna di bawah ini, tetapi apa yang ingin Anda capai? Mengodekan rutinitas daftar putih karakter Anda sendiri mungkin bukan rute terbaik.
medina
Terima kasih semuanya! Semua jawaban sangat membantu. Apa yang saya butuhkan info adalah: Saya sedang menulis alat yang akan menandai file di sistem file, dengan mengubah nama mereka (tidak ada metadata).
java.is.for.desktop
Lihat juga jawaban pada pengguna super .
pevik

Jawaban:

27

Ada diskusi tentang karakter nama file di artikel Wikipedia tentang Nama File .

Anda mungkin menemukan esai ini informatif: Memperbaiki Nama File Unix / Linux / POSIX .

Artikel ini membandingkan OS X dan Windows XP: X vs. XP: Karakter Terlarang dalam Nama File (PDF, lihat hal. 64-66).

Hal-Hal Yang Seharusnya Tidak Ada dalam Nama File untuk $ 1.000 Alex

Aku tidak tahu mana karakter harus un -escaped, tapi di Linux, itu mungkin bukan ide yang baik untuk melarikan diri karakter yang mungkin memiliki arti khusus seperti "n" (baris baru), "t" (tab) dan lain-lain, tapi itu umumnya bukan masalah dalam operasi file. Mungkin maksud Anda "melarikan diri" daripada "tidak melarikan diri". Yang paling umum adalah yang akan ditafsirkan oleh shell seperti spasi, ">", "<", dll. Lihat beberapa artikel yang saya tautkan untuk diskusi tentang itu.

Dennis Williamson
sumber
7
Ini sebenarnya bukan jawaban - semua informasi adalah eksternal. Dan beberapa tautan itu rusak sekarang.
Steve Bennett
26

Satu-satunya karakter yang tidak diizinkan dalam nama file di * nix adalah NULdan /. Pada Windows, hanya NUL, :dan \yang benar-benar tidak diperbolehkan, tetapi banyak aplikasi membatasi yang lebih lanjut, juga mencegah ?, *, +, dan %.

Pada titik tidak ada karakter dalam nama file perlu untuk melarikan diri kecuali sebagaimana diperlukan agar tidak ditafsirkan oleh shell.

Ignacio Vazquez-Abrams
sumber
Poin kedua patut ditekankan. Biasanya, "melarikan diri" mengacu pada mekanisme shell yang memungkinkan pengguna untuk menentukan string (misalnya pathnames) yang berisi karakter yang sebaliknya shell akan memperlakukan dengan cara khusus. Jika OP berarti menggunakan sesuatu seperti "persen penyandian" untuk menyandikan karakter yang tidak diizinkan, maka itu adalah "protokol nama jalur" tingkat aplikasi murni yang harus diadopsi oleh setiap program yang terlibat (atau tidak).
Chris Johnsen
Saya memindai folder dengan readdir kemudian mencoba membuka file dengan nama yang dikembalikan. Beberapa dari mereka gagal membuka dengan ENOENT yang menunjukkan bahkan untuk OS kadang-kadang Anda harus melarikan diri?
GM
13

Jika Anda membuat file di Windows dengan Explorer menggunakan salah satu karakter berikut, itu akan mengeluh bahwa karakter tidak diperbolehkan:

\ / : * ? " < > |

Referensi yang baik ada di sini:

Penamaan File, Paths, dan Namespaces
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

Microsoft selanjutnya menyatakan:

"... pada platform desktop berbasis Windows, karakter jalur yang tidak valid dapat mencakup karakter ASCII / Unicode 1 hingga 31, serta kutipan ("), kurang dari (<), lebih besar dari (>), pipa (|), backspace (\ b), null (\ 0) dan tab (\ t). "

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

Greg Askew
sumber
Saya ingat pernah membaca beberapa tahun yang lalu bahwa mode pengguna Windows memiliki batasan-batasan itu dan juga case-insensitive ("ABC.txt" === "abc.txt"). Namun, mode kernel Windows memiliki batasan lebih sedikit dan case-sensitive ("ABC.txt"! == "abc.txt" sama seperti * NIX). Namun, untuk semua maksud dan tujuan, karakter di atas akan berlaku untuk sebagian besar program karena dijalankan dalam mode pengguna.
CubicleSoft
Saya dapat melarikan diri \ / : * ? " < > |dari semuanya, dan membuatnya dengan mkdir di sistem GNU / Linux saya. Anda dapat menggunakan mkdir '?'untuk membuat ?direktori juga. Saya telah menggunakan sistem file ramdisk dan XFS untuk mengujinya.
S.Goswami
5

Di Linux dan sistem yang kompatibel dengan POSIX lainnya, "/" dicadangkan sebagai pemisah direktori, dan "\ 0" (karakter NULL) menunjuk akhir dari string. Yang lainnya diizinkan.

janneb
sumber
1
Meskipun sangat disarankan untuk menghindari baris baru, tab, karakter kontrol, dan sejenisnya, dan untuk memastikan nama file yang valid UTF-8.
Flimm