Qual é o tamanho máximo de um caminho de arquivo no Ubuntu?

9

Depois de usar os sistemas Windows há muito tempo, sei que em um determinado momento, uma janela de erro pode aparecer quando os nomes de arquivos e pastas se tornam muito longos.

Isso aconteceu comigo quando tentei fazer backup de arquivos com SFTP de um servidor para uma pasta (por exemplo):

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

Como você pode ver, às vezes tenho a tendência de criar caminhos de pastas muito especificados e, se um nome de arquivo também for longo, o NTFS poderá não conseguir salvá-lo dessa maneira.

No momento, estou preocupado com meus backups físicos, pois o caminho da pasta na minha unidade de backup será adicionado /backups/(drive name)/...a todos os caminhos de arquivo.

Existe algum limite (ou similar) no ext4 / Ubuntu que eu precisaria procurar?

Prototype700
fonte
2
Respondida em ServerFault: 4k. É um limite do SO, não um limite do FS. serverfault.com/questions/9546/…
John N

Respostas:

15

O comprimento máximo do nome do arquivo é 255 bytes. Encontrado na página wiki do ext4 .

E um caminho máximo de 4096 caracteres. Encontrado nesta pergunta sobre Unix e Linux SE .

Embora, eu encontrei este artigo wiki que não especifica o caminho máximo do arquivo no ext4.

jtoscarson
fonte
Oi jtoscarson, obrigado pela sua resposta. Eu provavelmente poderia tentar procurar isso, mas você gostaria de explicar o que significa um comprimento de "255 bytes"? Presumo que nem todos os caracteres necessariamente usem até 8 bits, de modo que seriam mais de 255 caracteres no total, presumo? Ou talvez menos, considerando que diferentes conjuntos de caracteres podem ser usados.
Prototype700
De um modo geral, um único caractere é de um byte. Não procurei a documentação, mas aqui está um teste simples: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m está contando caracteres e -c está contando bytes. A razão pela qual é 7 em vez de 6 é o caractere de fim de linha que não é impresso. Assim, os caracteres totais no nome do arquivo vai ser 255.
jtoscarson
1
O uso da localidade UTF-8 retorna 4para echo -n "💩" | wc -c. Criar um nome de arquivo chamado com esse nome levaria 4 bytes, apesar de esse nome de arquivo ter 1 grafema. Um "caractere" não é um conceito claramente definido (geralmente significa byte, grafema ou ponto de código UNICODE).
Mikko Rantalainen
Nos sistemas de arquivos criptografados, o comprimento máximo do nome do arquivo é de 143 bytes. Para decidir se um nome de arquivo é curto o suficiente, você pode encontrar seu comprimento de bytes em Python com len(filename.encode()).
Marvo
0

Acredito que a maneira mais confiável de determinar isso é com a pathconf(".", _PC_PATH_MAX);função POSIX, que determina o caminho máximo para um determinado caminho.

Como a função sugere, isso pode variar entre os sistemas de arquivos.

Eu não sei de um utilitário de linha de comando que o expõe. Aqui está um exemplo mínimo de C: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli adicionou uma nova foto
fonte
1
Isso também pode ser interessante: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy
0

Os limites do nome do caminho dependem do sistema de arquivos em uso. A resposta de jtoscarson cobre ext4, que é o padrão no Ubuntu, no entanto, você pode usar vários sistemas de arquivos no Ubuntu. Para citar a resposta do WerkkreW na falha do servidor , aqui estão alguns dos sistemas de arquivos e seus limites:

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

Observe também que vários sistemas de arquivos têm limitações quanto ao tipo de caractere que pode estar presente no nome do arquivo. Por exemplo, os nomes de arquivos em ext4não podem conter NULL e /. Consulte também o artigo da Wikipedia para comparações de sistemas de arquivos .

Observe também que os sistemas de arquivos Linux precisam levar em consideração as definições do POSIX :

3.266 Nome do caminho

Uma cadeia de caracteres usada para identificar um arquivo. No contexto do IEEE Std 1003.1-2001, um nome de caminho consiste em, no máximo, {PATH_MAX} bytes, incluindo o byte nulo final. Possui uma barra inicial opcional, seguida por zero ou mais nomes de arquivos separados por barras. Um nome de caminho pode opcionalmente conter uma ou mais barras finais. Várias barras sucessivas são consideradas iguais a uma barra.

De limits.h :

{PATH_MAX}

Número máximo de bytes em um nome de caminho, incluindo o caractere nulo final. Valor mínimo aceitável: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Número máximo de bytes em um nome de caminho. Valor: 256

Sergiy Kolodyazhnyy
fonte
0

Como @ sergiy-kolodyazhnyy disse, o tamanho máximo do nome do arquivo dependerá do sistema de arquivos e a grande maioria limita o tamanho do arquivo a 255 bytes.

Uma omissão notável de seu gráfico é a mídia ótica. Embora as extensões UDF e Rock Ridge tenham o mesmo limite de 255 caracteres para nomes de arquivos, a ISO9660 sem Rock Ridge e Joliet possuem limites muito mais rígidos com os quais você pode se deparar se estiver fazendo algo como fazer backup de youtube-dldownloads.

Os nomes de arquivos Joliet são limitados a 64 pontos de código UTF-16 ou 103 deles, se o programa de masterização de discos tiver a opção de interromper as especificações de maneiras que, aparentemente, não causem danos na prática.

Da mesma forma, os níveis 2 e 3 da ISO 9660, sem as extensões Rock Ridge, são limitados a nomes de arquivos com 31 ou 37 caracteres, se você estiver jogando rápido e livre com as especificações.

A ISO 9660: 1999, que é suportada pela imagem genérica, mas não por front-ends como o K3b, tem um limite de 207 bytes (sem Rock Ridge) ou 197 bytes (com Rock Ridge).

(Fonte: A página de genisoimagemanual)

Quanto ao tamanho máximo do caminho , esse é um grande equívoco. Não existe um para a maioria dos sistemas de arquivos Linux.

Há uma constante chamada PATH_MAX, mas é apenas o máximo para certas APIs POSIX , que você pode trabalhar em torno .

As únicas exceções consequentes a esta convenção "sem limite no comprimento do caminho" são FAT32 e exFAT (32.760 caracteres Unicode), NTFS e ReFS (32.767 caracteres Unicode), UDF (1.023 bytes) e ISO 9660 (claro, mas já vi indicado como 180, 207, 212 ou 222 bytes).

Isso pode ser facilmente demonstrado executando este pequeno programa Python e depois explorando os diretórios resultantes.

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

Meu bash, que exibe todo o caminho no prompt, terá problemas com ele. No entanto zsh, meu , que exibe apenas a pasta atual no prompt, não terá problemas e ainda possui um pwdbuilt-in que pode exibir todo o caminho de 5000 + bytes sem problemas.

ssokolow
fonte