Apakah benar menggunakan karakter khusus tertentu saat memberi nama file di Linux?

18

Apakah benar untuk menggunakan karakter tertentu khusus, seperti +, &, ', .(dot) dan ,(koma), pada dasarnya, dalam nama file.

Saya mengerti bahwa Anda dapat menggunakan -dan _tanpa masalah, tetapi melakukan penelitian saya tidak dapat menemukan sesuatu yang pasti tentang simbol-simbol lain; beberapa mengatakan bahwa Anda bisa, beberapa mengatakan bahwa Anda tidak bisa, dan beberapa yang lain mengatakan bahwa "tidak dianjurkan" untuk menggunakannya (apa pun artinya).

Chris Klein
sumber
Program apa yang Anda gunakan untuk bekerja dengan file-file ini. Hanya program yang menginterpretasikan beberapa karakter dengan cara khusus (mis. Shell pada string yang tidak dikutip) yang akan memberikan masalah. Program C rata-rata Anda mengambil semua yang bukan NUL tanpa berkedip.
Anthon
9
Apa yang Anda maksud dengan "benar"?
David Richerby
Masalah dengan menggunakan karakter khusus dalam nama file adalah bahwa hal itu meningkatkan kemungkinan bahwa beberapa kode kereta akan salah menangani nama file. Namun, saya tidak berpikir salah satu karakter yang Anda daftarkan cenderung menyebabkan masalah apa pun. Anda akan memiliki lebih banyak masalah dengan spasi putih, yang umumnya harus dihindari . Dan EOL, khususnya, harus dihindari dengan cara apa pun.
Windows memiliki batasan yang lebih ketat pada apa yang bisa ada dalam nama file, jadi jika ada kemungkinan file perlu digunakan di sana, itu adalah sesuatu yang perlu diperhatikan.
evilsoup

Jawaban:

28

Apakah benar menggunakan karakter khusus tertentu, seperti +, &, ',. (titik) dan, (koma), pada dasarnya, dalam nama file.

Iya.

Benar tetapi tidak selalu disarankan atau nyaman.

Anda dapat menggunakan karakter apa pun kecuali null dan di/ dalam nama file di sistem file Unix dan Linux modern.

Anda dapat menggunakan tanda baca ASCII . Beberapa utilitas menggunakan berhenti ( titik ) dan koma dalam nama file yang mereka buat.

Anda dapat menggunakan karakter kontrol ASCII , namun hal ini tidak disarankan karena tidak mungkin ditampilkan dengan dapat diterima dan sulit digunakan.

Anda dapat menggunakan shell meta-karakter seperti ASCII ampersand dan ASCII apostrof. Namun ini tidak nyaman dan mengharuskan ketika membangun perintah Anda berhati-hati untuk mengutip atau melarikan diri karakter tersebut.

Anda dapat menggunakan karakter multi-byte menggunakan berbagai penyandian. Terserah shell dan / atau utilitas untuk menafsirkan dan menampilkan karakter non-ASCII dengan benar. Dianjurkan untuk membatasi diri Anda pada pengkodean populer seperti UTF-8 dan mengatur lokal dengan tepat.

Anda akan memiliki masalah paling sedikit menggunakan karakter ASCII yang dapat dicetak, membatasi rangkaian karakter tanda baca untuk karakter yang bukan shell meta-karakter dan tidak memulai nama dengan tanda hubung (atau berhenti - kecuali Anda ingin menyembunyikan file).

RedGrittyBrick
sumber
23

Seperti yang telah dinyatakan orang lain, pada sistem Unix / Linux modern, nama file dapat berisi karakter apa pun kecuali untuk \0(NUL) dan /(slash).

Selain itu, standar POSIX mendefinisikan set karakter portabel untuk nama file:

3.278 Set Karakter Nama File Portabel

Himpunan karakter dari mana nama file portabel dibangun.

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 . _ -

Tiga karakter terakhir masing-masing adalah karakter <Period>, <underscore>, dan <hyphen>. Lihat juga Pathname .

The pathchkutilitas dari GNU Coreutils pemeriksaan untuk ini saat dipanggil dengan -ppilihan, dan -Ppilihan akan memperingatkan tentang nama file kosong (yang tidak valid tetapi mungkin dilewatkan sebagai argumen untuk pathchk) dan nama file yang dimulai dengan tanda hubung ( -).

nyuszika7h
sumber
9

Taruhan teraman adalah merujuk ke entri wikipedia untuk set karakter yang diizinkan untuk sistem operasi apa pun. Itu bisa ditemukan di sini .

Sebagai contoh, untuk sebagian besar sistem berbasis unix, set karakter yang diizinkan adalah 8 bit set dan karakter yang dipesan adalah karakter nol (NUL, '\0'). Namun, itu bukan praktik yang baik untuk menggunakan karakter khusus dalam nama file karena mereka menimbulkan masalah saat menghapusnya.

Misalnya, saya dapat memiliki nama file -ramesh.txtdan mencoba menghapusnya seperti di bawah ini.

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.

Saya perlu menghapus file sebagai,

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

Rincian lebih lanjut dapat ditemukan dari jawaban ini juga .

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.

Jadi untuk menyimpulkan, masalahnya bukan dalam menggunakan karakter khusus untuk nama file tetapi tentang cara menanganinya.

Ramesh
sumber
Untuk alasan itu ("bagaimana cara menanganinya"), saya hampir secara eksklusif hanya menggunakan huruf, angka, garis bawah, dan titik, jika hanya untuk membuat hidup saya lebih mudah ketika saya kemudian memutuskan saya perlu menggunakan program baris perintah untuk melakukan hal-hal pada file saya (yang sepertinya selalu muncul setidaknya sekali).
phyrfox
19
Bukan untuk menganjurkan nama file dimulai dengan -tetapi hanya untuk menjadi tepat: 1) Anda pasti tidak memerlukan tanda kutip di sekitar nama file ini, 2) alih-alih menggunakan --argumen khusus Anda dapat melakukan persis apa yang rmdisarankan sendiri:, rm ./-ramesh.txtjadi Anda tidak perlu melakukannya persis seperti yang Anda sarankan.
Michał Politowski
@ MichałPolitowski Tidak hanya Anda tidak perlu tanda kutip, mereka memiliki efek nol.
ctrl-alt-delor
4

Penelitian Anda hampir benar. Dimungkinkan untuk menggunakan karakter khusus dalam nama file, tetapi tidak disarankan karena karakter ini memiliki arti khusus. Konvensi Penamaan File di Linux menjelaskan pembatasan lain pada nama file juga seperti "Nama file tidak boleh dimulai dengan tanda hubung."

Contoh sederhana melakukan operasi baris perintah dengan karakter khusus dalam nama file.

Sebagai catatan pribadi, saya lebih suka menghindari karakter khusus dalam nama file karena mereka memerlukan perhatian khusus ketika file-file ini digunakan untuk pemrosesan apa pun. Dengan demikian, menghilangkan kekhawatiran berurusan dengan karakter khusus dari proses pengembangan.

Simply_Me
sumber
1
Jadi saran Anda adalah menggunakan saja -, _dan .(dot) dalam nama file?
Chris Klein
@ ChrisKlein, ya, meskipun tidak di awal nama file.
Simply_Me
Arti khusus dalam program (mis. Shell Anda), bukan nama file. Hampir semua program di U & L tidak peduli tentang karakter sama sekali selama tidak ada NUL di nama file.
Anthon
@Anthon, ya, shell saya seperti yang dijelaskan dalam tautan.
Simply_Me
2
Sebagai catatan pribadi, saya akan merekomendasikan pengembang memberi nama folder induk dari proyek mereka sesuatu seperti "föλder \ t☃" - sehingga mereka akan segera melihat jika mereka membuat bug yang merusak nama file seperti itu, alih-alih menerbitkan kode yang rusak atau binari bahwa orang lain harus bekerja. Menggunakannya bukan masalah, asalkan itu satu-satunya yang dimulai dengan 'f', penyelesaian-tab di shell apa pun akan memasukkan hal-hal yang sulit diketik.
Peteris