Salvei alguns vídeos em uma unidade NTFS externa que meu sistema Linux pode ver muito bem.
Ao tentar usar um macOS para o mesmo propósito, uma pasta que eu estava procurando simplesmente estava faltando. Eu não tinha um computador Linux comigo na época, então tentei acessar essa pasta com o computador de um amigo executando o Windows 10.
A pasta estava visível no Windows 10, mas os vídeos não eram reproduzidos com um erro dizendo:
"…O nome do diretório é inválido."
Dito isto, os vídeos podem ser copiados e reproduzidos a partir da unidade interna do Windows.
Tentando mais tarde renomear pastas no Windows, recebo esta mensagem:
"Isso não está mais localizado em "/media/cip/TOSHIBA_1TB/CINEMA/American_canada-australia/Charlie Chaplin" verifique a localização do item e tente novamente."
O caminho da pasta não tem nenhum caractere estranho (vou renomear todas as pastas do caminho no Linux de qualquer maneira e relatar). Alguns dos arquivos de vídeo têm nomes franceses com caracteres acentuados, mas isso não deve ser um problema: o Mac estava todo em francês com todos os seus arquivos e pastas em francês de qualquer maneira, e outros arquivos e pastas em francês de outra unidade externa são acessíveis.
Qual seria a razão? O que pode ser feito para permitir que eles sejam visíveis em sistemas macOS?
Testei novamente com outro sistema macOS e a pasta ainda não pode ser vista. Vou tentar testar novamente no Windows e atualizar quando puder.
EDIT : Eu removi a referência NTFS do título, pois o problema foi reproduzido em unidades com outros tipos de formatação.
Estou postando esta resposta apenas para dizer como o problema foi resolvido, resumindo assim os comentários feitos à pergunta original , que podem ser úteis para outras pessoas.
Corrigi o problema no Linux, onde essas pastas foram criadas, simplesmente encurtando o título de dois ou três dos arquivos de vídeo, que tinham nomes longos, mas sem caracteres obviamente estranhos, como vírgulas, colchetes, etc. nomes - embora não tivessem nada de especial. Mudá-los de volta não reproduziu o problema.
Portanto, ou os nomes das pastas tinham algum caractere errado que não era visível como tal no Linux, ou os caracteres ruins em alguns dos três arquivos que foram renomeados tornaram a pasta inteira invisível no Mac e todos os seus conteúdos não podem ser reproduzidos no Windows.
Esta é a coisa mais estranha que, antes de renomear as pastas e os três arquivos, nenhum dos arquivos era reproduzível no Windows.
Pode ter sido, como @Giacomo1968 disse em um comentário :
O problema é que antes de corrigir o problema tentei reproduzir no Windows outros arquivos além daqueles que foram renomeados no final. O caractere fantasma também pode estar nos nomes das pastas.
Aconteceu comigo novamente em uma nova unidade formatada como exFAT com outros arquivos em uma pasta sobre a qual um erro foi relatado no Linux pelo gerenciador de arquivos Nemo durante a cópia (algo como "não é possível criar arquivo"), mas na verdade tudo parecia bem no Linux. Essa pasta foi vista, mas permaneceu completamente inacessível no Windows (não me lembro exatamente da mensagem de erro, algo sobre arquivo ou pasta não existente), e foi vista em um Mac, exceto um único arquivo, que permaneceu invisível. Após renomear no Linux a pasta e o arquivo com o mesmo nome tudo correu normalmente!
Agora suspeito que a causa do problema inicial relatado na pergunta e a criação de um caractere 'fantasma' ruim foi algum erro durante um processo de cópia ou a colagem no título do texto copiado de páginas da Internet (onde o que parece um espaço, por exemplo, é de fato outra coisa). Isso foi sugerido para mim pelo fato de que, ao copiar com o Double Commander no Linux, ele relatou erros detalhados em alguns nomes que incluem espaços que podem ser caracteres Tab ou algo semelhante.
(Para evitar esses erros ao copiar/colar o texto selecionado da Internet, algo como um complemento "copiar somente texto" para o firefox pode ser muito útil.)
No final, a melhor solução para copiar foi usar o Double Commander no Linux que indicava muito claramente o nome do arquivo que apresentava problemas.
Copiar/colar texto da Internet ao nomear arquivos ou pastas deve ser feito com cuidado.
A maneira como os nomes de arquivos/pastas funcionam no Windows é discutida no site da Microsoft . No entanto, isso fornece apenas um vislumbre da verdade geral.
Quanto ao sistema de arquivos, vou me limitar ao NTFS, assim como a pergunta. Considere o seguinte comentário do site vinculado acima:
Agora, precisamos entender um pouco da terminologia primeiro. Lidamos com várias ... camadas, provavelmente é um termo adequado:
(se você quiser dar uma olhada, use uma ferramenta como WinObj )
Um bom método para brincar com isso é um compartilhamento Samba que finge ser NTFS para o lado do cliente. Mas um volume Windows NTFS também serve. Estaremos no Windows e "brincar" a partir da linha de comando (pressione Win+ Re digite
cmd
, depois pressione Enter).Volume NTFS local
Suponha que queiramos criar um nome de arquivo inválido (observe o ponto final?!):
Ao tentar isso, o resultado será de fato
test.txt
, nãotest.txt.
. O subsistema Win32 (csrss.exe) nos impediu de fazer coisas estúpidas. Hum, interessante, hein?Considere esta outra afirmação:
Hmm,
NUL
parece divertido. Sabemos disso por ser um substituto para/dev/null
sistemas unixoid, herdados dos tempos do DOS.Oh, certo. É um substituto para
/dev/null
, então a saída será engolida. Mas não use sons tão tentadores. Então, vamos usar as informações resumidas de um artigo do blog do Project Zero , seção "Dispositivo Local".Como podemos ver no artigo do Project Zero, há várias maneiras de evitar conversões de nome de caminho no nível do subsistema Win32. Um desses métodos é o prefixo que se traduz
\\?\
internamente diretamente\??\
em , que nas versões mais recentes do Windows é idêntico a\GLOBAL??\
. Isso é chamado de diretório de objeto (por favor, não o confunda com entidades do sistema de arquivos , apesar da terminologia semelhante!). Novamente, WinObj e ferramentas semelhantes permitem que você investigue o espaço de nomes do gerenciador de objetos.Então nosso objetivo era criar um arquivo (ou diretório) nomeado
NUL
e o subsistema Win32 não nos permitiu. Ele simplesmente engoliu a saída e o arquivo nunca foi criado em nosso diretório de trabalho. Aproveitando as informações do artigo vinculado acima e do interlúdio anterior, no entanto, podemos contornar isso evitando essas conversões de caminho traquinas no nível do subsistema emitindo um:Como lembrete,
%CD%
expande para o caminho absoluto do diretório de trabalho atual e, supondo que sejaC:\test
, o comando acima é equivalente aecho NONSENSE > \\?\C:\test\NUL
.E eis que, uma rápida
dir
prova que o arquivo foi criado. E se tentarmos isso com outros nomes "reservados", também funcionará bem.Observe que você também pode usar o formulário de caminho do NT nativo real
\??
( em vez de\\?
) para o mesmo efeito:Organizado.
Então, que tal revisitarmos a tentativa do ponto final, mas dando o caminho completo sem que o subsistema Win32 interfira?:
dir /b
Voila, funciona, como prova rápida :Agora que finalmente criamos um arquivo "impossível"
test.txt.
, vamos dar uma olhada nele, certo?Que diabos? Lembro-me claramente de ter ecoado
ILLEGAL TRAILING DOT
nesse arquivo.Ah, claro. Assim como quando inicialmente tentamos criar
test.txt.
o subsistema Win32, intervimos novamente e "utilmente" converteu nosso nome paratest.txt
. Então, na verdade, estamos olhando em\??\%CD%\test.txt
vez de\??\%CD%\test.txt.
.Então isso deve fazer:
Muito melhor. O problema é que nem todos os programas lidarão com nosso desvio sorrateiro das conversões de nome de caminho do Win32 com a mesma facilidade do
cmd.exe
. Suponha que queiramos abrir o Bloco de Notas:Dang, podemos ver a seguinte caixa de mensagem:
Portanto, embora existam maneiras de contornar algumas das restrições impostas pelo subsistema Win32, a utilidade desses métodos é limitada e questionável.
Nota : Os leitores que também desenvolvem software no/para Windows devem lembrar que usar o prefixo
\\?\
permitia contornar oMAX_PATH
limite (costumava ser 260, basicamente 255 mais\\?\
e um terminando\0
). Agora você sabe por que isso nos permite usar aproximadamente 32.767 caracteres . Como o UCS-2 foi substituído pelo UTF-16 (acho que no XP), o desmembramento do caminho no nível do gerenciador de objetos é apenas um problema. Outra é que em UTF-16 um ponto de código pode ocupar mais de 16 bits (akawchar_t
ouWCHAR
), uma vez que você deixa o BMP para trás.De qualquer forma, a linha de comando (
cmd.exe
) fornece todas as ferramentas para acessar e se livrar dos arquivos que você conseguiu criar no Windows em primeiro lugar.Compartilhamento Linux/Samba, fingindo ser NTFS
Vamos agora partir da unidade local e considerar uma unidade de rede mapeada
Z:
, fornecida pelo Samba 4.x, que imita uma unidade NTFS no que diz respeito ao Windows.Este experimento oferece mais alguns insights, porque podemos criar arquivos de acordo com as regras do lado do Linux e não precisamos ficar ansiosos por não conseguir acessá-los do lado do Windows.
Z:
e estaremos noZ:\test
lado do WindowsO artigo da Wikipedia nos diz que todos os caracteres exceto
/
e\0
(também conhecido como caractere ASCII NUL ) são permitidos! Então isso deve ser divertido.Here are some extravagant file names which should (or at least could) be hard to access on the Windows side, using Bash on Ubuntu 20.04 on the Linux side to create them:
:.txt
(created withecho "$RANDOM" > \:.txt
)???.txt
(created withecho "$RANDOM" > \?\?\?.txt
)?.txt
(created withecho "$RANDOM" > ?.txt
)*.txt
(created withecho "$RANDOM" > \*.txt
)\.txt
(created withecho "$RANDOM" > \\.txt
)".txt
(created withecho "$RANDOM" > \".txt
)>.txt
(created withecho "$RANDOM" > \>.txt
)<.txt
(created withecho "$RANDOM" > \<.txt
)|.txt
(created withecho "$RANDOM" > \|.txt
)This should pretty much cover all bases, actually on second thought the emoji may not even be an issue at all. Forward slashes are also forbidden on NTFS, but that holds true for btrfs/POSIX/SUS as well.
Proof from the Linux side:
Now let's see if and what we can access on the Windows side ...
Screenshot as proof:
Ohhhhh! Right, the DOS heritage of Windows strikes again. NTFS - unless actively disabling it - has the ability to create so-called 8.3 short file names, conforming to the DOS file name requirements.
And that's how we are able to access the invalid file names regardless.
Conclusion
Now recall, the question was about an external, i.e. local, NTFS drive. This means the rules we just observed for Samba shares may not apply here.
Depending on the driver used to store these files (which could vary by Linux/macOS version, e.g. ntfs-3g or the third-party driver used, e.g. Paragon's driver) I see the following possible causes left after looking at the above experiments:
:
,"
or?
... this seems the most likely to me, given I'd had accidentally copied and pasted ebook titles myself, containing these characters. We can pretty much rule out/
and the other "forbidden" characters are at least less likely.Para o primeiro cenário, eu recomendaria usar fslint no lado do Linux para limpar os nomes dos arquivos (e pastas). Existem outras ferramentas semelhantes e YMMV, escolha.
Espero que isto ajude. Demorou o suficiente para despejar meus pensamentos na escrita.
Leitura adicional