Berapa panjang maksimum jalur file di Ubuntu?

9

Setelah menggunakan sistem Windows untuk waktu yang lama, saya tahu bahwa pada titik tertentu, jendela kesalahan dapat muncul ketika file dan nama folder menjadi terlalu panjang.

Ini terjadi pada saya ketika saya mencoba untuk membuat cadangan file dengan SFTP dari server ke folder di (misalnya):

D:(Windows drive partition)/Temporary/Projects/2015-06/Websites/Guitar-Site/Images/Logos/Manufacturers/Instruments/Basses/(long file name).png

Seperti yang Anda lihat, saya cenderung membangun path folder yang sangat spesifik kadang-kadang dan jika nama file terlalu panjang, NTFS mungkin tidak dapat menyimpannya dengan cara ini.

Saat ini saya mengkhawatirkan cadangan fisik saya, karena jalur folder pada drive cadangan saya akan ditambahkan /backups/(drive name)/...ke semua jalur file.

Apakah ada batasan seperti itu (atau yang serupa) di ext4 / Ubuntu yang harus saya perhatikan?

Prototipe700
sumber
2
Dijawab pada ServerFault: 4k. Ini adalah batas OS, bukan batas FS. serverfault.com/questions/9546/…
John N

Jawaban:

15

Panjang nama file maks adalah 255 byte. Ditemukan di halaman wiki untuk ext4 .

Dan jalur maksimum 4096 karakter. Ditemukan dalam Pertanyaan SE Unix & Linux ini .

Meskipun, saya menemukan artikel wiki ini yang tidak menentukan path file maks di ext4.

jtoscarson
sumber
Hai jtoscarson, terima kasih atas jawaban Anda. Saya mungkin bisa mencoba mencari ini, tetapi apakah Anda mau menjelaskan apa arti panjang "255 byte"? Saya berasumsi bahwa tidak semua karakter menggunakan 8 bit, sehingga totalnya akan lebih dari 255 karakter, saya kira? Atau mungkin kurang, mengingat karakter yang berbeda bisa digunakan.
Prototype700
Secara umum satu karakter adalah satu byte. Saya tidak mencari dokumentasi, tetapi di sini adalah tes sederhana: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m menghitung karakter dan -c menghitung byte. Alasan mengapa itu adalah 7 bukannya 6 adalah karakter garis akhir yang tidak dicetak. Jadi total karakter dalam nama file akan menjadi 255.
jtoscarson
1
Menggunakan pengembalian lokal UTF-8 4untuk echo -n "💩" | wc -c. Membuat nama file yang disebut dengan nama itu akan memakan waktu 4 byte meskipun fakta bahwa nama file ini adalah 1 grapheme panjang. "Karakter" tidak jelas konsep (biasanya berarti byte, grapheme atau titik kode UNICODE).
Mikko Rantalainen
Pada filesystem terenkripsi panjang nama file maksimal adalah 143 byte. Untuk memutuskan apakah nama file cukup pendek, Anda dapat menemukan panjang byte-nya dengan Python len(filename.encode()).
Marvo
0

Saya percaya bahwa cara yang paling dapat diandalkan untuk menentukan ini adalah dengan pathconf(".", _PC_PATH_MAX);fungsi POSIX, yang menentukan jalur maksimum untuk jalur yang diberikan.

Seperti fungsi yang disarankan, ini dapat bervariasi antar sistem file.

Saya tidak tahu utilitas baris perintah yang memaparkannya. Berikut adalah contoh C minimal: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber
1
Ini mungkin juga menarik: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy
0

Batas pathname tergantung pada sistem file yang digunakan. Jawaban jtoscarson mencakup ext4 yang merupakan default pada Ubuntu, namun Anda dapat menggunakan berbagai filesystem di Ubuntu. Untuk mengutip jawaban WerkkreW di serverfault, berikut adalah beberapa filesystem dan batasannya:

BTRFS   255 bytes
exFAT   255 UTF-16 characters
ext2    255 bytes
ext3    255 bytes
ext3cow 255 bytes
ext4    255 bytes
FAT32   8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS    255 characters
XFS     255 bytes

Perhatikan juga bahwa berbagai sistem file memiliki keterbatasan untuk jenis karakter apa yang dapat hadir dalam nama file. Misalnya, nama file dalam ext4tidak boleh mengandung NULL dan /. Lihat juga, artikel Wikipedia untuk perbandingan sistem file .

Perhatikan juga bahwa sistem file Linux harus mempertimbangkan definisi POSIX :

3.266 Pathname

String karakter yang digunakan untuk mengidentifikasi file. Dalam konteks IEEE Std 1003.1-2001, nama path terdiri dari, paling banyak, {PATH_MAX} byte, termasuk terminasi null byte. Ini memiliki garis miring awal opsional, diikuti oleh nol atau lebih nama file yang dipisahkan oleh garis miring. Pathname secara opsional dapat mengandung satu atau lebih garis miring. Beberapa tebasan berturut-turut dianggap sama dengan satu tebasan.

Dari limit.h :

{PATH_MAX}

Jumlah maksimum byte dalam nama path, termasuk karakter null terminating. Nilai Minimum yang Dapat Diterima: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Jumlah maksimum byte dalam nama path. Nilai: 256

Sergiy Kolodyazhnyy
sumber
0

Seperti yang dikatakan @ sergiy-kolodyazhnyy, panjang nama file maksimum akan tergantung pada sistem file dan sebagian besar batas panjang nama file hingga 255 byte.

Kelalaian penting dari bagannya adalah media optik. Sementara ekstensi UDF dan Rock Ridge memiliki batas 255 karakter yang sama untuk nama file, ISO9660 tanpa Rock Ridge dan Joliet keduanya memiliki batas yang jauh lebih ketat sehingga Anda mungkin benar-benar akan menghadapi kesulitan jika Anda melakukan sesuatu seperti membuat cadangan youtube-dlunduhan.

Nama file Joliet terbatas pada 64 titik kode UTF-16 atau 103 jika program penguasaan disk Anda memiliki opsi untuk keluar dari spesifikasi dengan cara yang tampaknya tidak membahayakan praktik.

Demikian juga, ISO 9660 Level 2 & 3, tanpa ekstensi Rock Ridge, terbatas pada nama file 31 karakter atau 37 jika Anda bermain cepat dan longgar dengan spek.

ISO 9660: 1999, yang merupakan didukung oleh genisoimage tetapi tidak oleh frontends seperti K3b, memiliki batas baik 207 bytes (tanpa Rock Ridge) atau 197 byte (dengan Rock Ridge).

(Sumber: Halaman genisoimagemanual)

Adapun panjang jalur maksimum , itu kesalahpahaman besar. Tidak ada satu untuk kebanyakan sistem file Linux.

Ada konstan bernama PATH_MAX, tapi itu hanya maksimal untuk API POSIX tertentu , yang dapat Anda bekerja di sekitar .

Satu-satunya konsekuensi konsekuensi terhadap konvensi "tidak ada batas panjang lintasan" ini adalah FAT32 dan exFAT (32.760 karakter Unicode), NTFS dan ReFS (32.767 karakter Unicode), UDF (1.023 byte), dan ISO 9660 (tidak jelas, tetapi saya pernah melihat itu dinyatakan sebagai 180, 207, 212, atau 222 byte).

Ini dapat dengan mudah ditunjukkan dengan menjalankan program Python kecil ini dan kemudian menjelajahi direktori yang dihasilkan.

import os
for X in range(20):
    os.mkdir('x' * 255)
    os.chdir('x' * 255)

My bash, yang menampilkan seluruh path pada prompt, akan mengalami masalah dengannya. Namun saya zsh, yang hanya menampilkan folder saat ini di prompt tidak akan mengalami masalah dan bahkan memiliki pwdbuiltin yang dapat menampilkan seluruh 5000 + -byte path tanpa masalah.

ssokolow
sumber