Dikatakan bahwa pada Unix dan Linux secara umum, Anda harus menghindari spasi dalam nama file file (file biasa, direktori, tautan, file perangkat, ...).
Tetapi saya melakukan itu sepanjang waktu. Untuk nama file dengan spasi di dalam,
- Dalam Nautilus, karakter spasi ditampilkan sebagai spasi.
- Di terminal Bash, saya gunakan
\
untuk merepresentasikan spasi, atau melampirkan nama file dalam sepasang tanda kutip ganda. - dalam beberapa file aplikasi (Nautilus, tidak yakin apakah OS juga akan melakukannya), nama file ditulis dengan spasi diganti dengan
%20
.
Apakah ruang benar-benar tidak diizinkan dalam nama file?
Bagaimana Anda menggunakan atau menangani spasi dalam nama file dengan benar?
-rf ~
(gunakantouch -- "-rf ~"
), tetapi saya tidak akan merekomendasikannya./
pemisah). Menggunakan semua 254 byte tersisa membuka pintu ke semua cara "nama" eldritch yang tak terkatakan. Jelas ini gila, tetapi tidak semua orang setuju tentang apa itu "waras", dan berbagai karakter akan merusak alat yang berbeda. Persimpangan kewarasan semua orang cukup kecil .Jawaban:
Spasi, dan memang setiap karakter kecuali
/
dan NUL, diizinkan dalam nama file. Rekomendasi untuk tidak menggunakan spasi dalam nama file berasal dari bahaya bahwa mereka mungkin disalahartikan oleh perangkat lunak yang kurang mendukungnya. Boleh dibilang, perangkat lunak semacam itu buggy. Tetapi juga bisa dibilang, bahasa pemrograman seperti shell scripting membuatnya terlalu mudah untuk menulis perangkat lunak yang rusak ketika disajikan dengan nama file dengan spasi di dalamnya, dan bug ini cenderung melewatinya karena skrip shell tidak sering diuji oleh pengembang mereka menggunakan nama file dengan spasi di mereka.Spasi diganti dengan
%20
tidak sering terlihat dalam nama file. Itu sebagian besar digunakan untuk URL (web). Meskipun benar bahwa% -encoding dari URL kadang-kadang membuat jalannya menjadi nama file, seringkali secara tidak sengaja.sumber
bash
. Saya mencoba beberapa hal seperti mengutipnya dengan Ctrl-V dan sesuatu seperti$(echo -e \\0)
tetapi tidak berhasil. Masalahnya, alasan NUL tidak dapat digunakan dalam nama file adalah bahwa itu tidak dapat digunakan dalam string C (karena itu adalah terminator string) dan semua API yang mendasari serta hampir semua string yang ditangani oleh program C menggunakan format itu . Karenabash
ditulis dalam C, mungkin tidak memiliki dukungan sama sekali untuk setiap string dengan NUL di dalamnya. Saya bisa saja salah, mungkin ada cara yang tidak jelas ...NUL
dan bash, yang Anda butuhkan$'\0'
. Misalnya:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Ruang yang diperbolehkan dalam nama file, seperti yang Anda telah mengamati.
Jika Anda melihat entri "kebanyakan sistem file UNIX" di bagan ini di wikipedia , Anda akan melihat:
Kumpulan karakter 8-bit diizinkan. Kita juga dapat memasukkan ASCII 7-bit di bawah payung ini, karena ini adalah subset dari berbagai set 8-bit dan selalu diimplementasikan menggunakan 8 bit byte.
Satu-satunya karakter terlarang adalah
/
dan "null". "Null" mengacu pada byte nol, tetapi ini tidak diperbolehkan dalam data teks.Namun , jika Anda menggunakan shell, Anda mungkin menyadari bahwa ada beberapa karakter yang akan membuat kerumitan, yang paling signifikan
*
, yang merupakan operator globbing POSIX.Bergantung pada bagaimana Anda ingin mendefinisikan "kerumitan", Anda dapat menyertakan spasi putih (spasi, tab, baris baru, dll.) Di sana, karena ini menciptakan kebutuhan untuk mengutip
""
. Tapi ini tidak bisa dihindari, karena ruang diperbolehkan, jadi ...Dalam konteks shell / command line, bungkus nama file dalam tanda kutip tunggal atau ganda (tetapi perhatikan bahwa itu bukan WRT masalah lain yang sama ), atau lepaskan ruang dengan
\
, misalnya:sumber
touch $(echo -e "foo\00bar")
--e
proses\0N
sebagai nilai oktal, tetapi masih hilang di suatu tempat, karena itu hanya membuat file bernamafoobar
. Tentu saja NULL tidak dapat dicetak, tapi saya jamin itu hilang dari sana karena pembatasan string C.foo[NULL]bar
akan berakhir sepertifoo
untuk sebagian besar maksud dan tujuan. Fakta yang tidak terjadi dengan ituecho -e
menunjukkan NULL telah dipangkas di suatu tempat./
yang merupakan pemisah direktori dan tidak dapat dikutip, sehingga bisa dalam pathname tetapi tidak dalam nama file).Alasannya sebagian besar historis - CARA kembali dalam kabut ruang waktu tidak diperbolehkan dalam nama file, sehingga ruang digunakan sebagai pemisah kata kunci / nama file. Penerjemah shell masa depan harus kompatibel dengan skrip lama, dan dengan demikian kita terjebak dengan sakit kepala yang kita miliki saat ini.
Pengembang proses yang tidak perlu berurusan dengan manusia sangat banyak dapat membuat banyak hal, lebih mudah dengan menjatuhkan ruang sama sekali. Apple melakukan ini, isi / System / Library / CoreServices / berisi sangat sedikit ruang, program dengan ruang dibuka atas nama pengguna, dan WillWookStrangeIfCamelCased. Jalur unix-only yang serupa juga menghindari spasi.
(Anekdot yang agak terkait: pada pertengahan 90-an sebuah drone Windows mengatakan "Sebutkan satu hal yang dapat Anda lakukan pada Mac yang tidak dapat saya lakukan pada Windows" -> "Gunakan 12 karakter dalam nama file." -> Diam. juga dimungkinkan dalam 12 karakter)
sumber
Jadi ya, seperti yang dinyatakan berkali-kali di tempat lain, nama file dapat berisi hampir semua karakter. Tapi perlu dikatakan bahwa nama file adalah tidak file. Itu memang membawa bobot sebagai atribut file karena Anda biasanya memerlukan nama file untuk membuka file, tetapi nama file hanya menunjuk ke file yang sebenarnya. Ini adalah tautan, disimpan dalam direktori yang telah merekamnya, di samping nomor inode - yang merupakan perkiraan yang jauh lebih dekat dengan file aktual .
Jadi, Anda tahu, sebut saja apa yang Anda inginkan. Kernel tidak peduli - semua referensi file yang akan ditangani akan menangani nomor inode yang sebenarnya. Nama file adalah sesuatu untuk konsumsi manusia - jika Anda ingin membuatnya gila, yah, itu adalah sistem file Anda. Di sini, saya akan melakukan beberapa hal gila:
Pertama saya akan membuat 20 file, dan beri nama mereka dengan spasi, masing-masing nama file mengandung satu lebih banyak ruang daripada yang terakhir:
Ini agak lucu. Lihat saya
ls
:Sekarang saya akan mirror direktori ini:
Berikut
../mirror/
isinya:Ok, tapi mungkin Anda bertanya - tapi apa gunanya itu Bagaimana Anda bisa tahu yang mana? Bagaimana Anda bisa yakin bahwa Anda menautkan nomor inode yang tepat ke nama file yang tepat?
Baik...
KELUARAN
Lihat, nomor inode yang terkandung
../mirror/"${tgt%% .*}"
dan yang direferensikan dengan./' '
merujuk ke file yang sama. Mereka menggambarkan file yang sama. Mereka menamainya, tetapi tidak lebih. Tidak ada misteri, sungguh, hanya beberapa ketidaknyamanan yang mungkin Anda buat untuk diri Anda sendiri, tetapi pada akhirnya akan sedikit berpengaruh pada operasi sistem file unix Anda pada akhirnya.sumber