SMB длинные имена файлов

shwed

Dabbler
Joined
Mar 9, 2021
Messages
12
Переношу данные с файлового сервера на Windows 2012R2 на Truenas.
Выяснилось, что Truenas не нравятся длинные имена файлов.
По крайней мере, при копировании по SMB.
При попытке скопировать файл с именем вида RE_ Северо-Осетинский филиал АО _АльфаСтрахование__ уведомление о поступившем требовании потерпевшего по полису ОСАГО ХХХ00123456789 Фамилия И_О_.msg
Получаем ошибку вида "Указано неправильное или слишком длинное имя файла",
Это и в проводнике, и через robocopy.
Копируем прямо в корень SMB шары.
Если копировать этот же файл в SMB шару на WIndows - все копируется нормально.
Ограничения ZFS?
Можно ли это как то дополнительно настроить?

К сожалению, отказаться от этих длинных имен файлов никак, они привязаны в информационной системе компании.
 

chs

Guru
Joined
Apr 18, 2017
Messages
500
А через префикс \\?\ Тоже не получается ?
 

shwed

Dabbler
Joined
Mar 9, 2021
Messages
12
Опытным путем выяснил следующее.
В консоли получилось создать файл с именем, максимальная длина которого 146 символов.
Если имя длиннее, получаем сообщение File name too long
Наткнулся на обсуждение 2014 года https://github.com/openzfs/zfs/issues/2344
Проблема в том, что кириллические имена в UTF занимают в два раза больше байт.
Т.е. если имя файла 146 символов, то получается 292 символа.
Но почему дает создать файл с именем из 145 символов? Это 290 байт.

Понравился еще комментарий https://forum.lissyara.su/networks-f4/problema-s-rsync-file-name-too-long-t34772.html:
"Чёрт возьми. Файловая система ZFS с поддержкой триллиардов петабайтовых пулов и бесконечных чисел снапсшотов и ещё огромных количеств и объёмов всего на свете. И такое ничтожное ограничение, из-за которого появляется такая маленькая, но гадостная проблемка. Непонятно"

И еще интересное решение и краткой теорией https://wiki.etersoft.ru/Linux/VLFN

В общем, печально это.
 

shwed

Dabbler
Joined
Mar 9, 2021
Messages
12
В итоге решил обработать массив исходных файлов перед копированием скриптом на powershell вида
Get-ChildItem -Recurse -File | Where-Object {$_.Name.Length -gt 145} | ForEach-Object{
Write-Output "Длина имени файла $($_.FullName) равна $($_.Name.Length)"
Add-Content lenght.txt "Длина имени файла $($_.FullName) равна $($_.Name.Length)"
Rename-Item -Path $_.FullName -NewName ( ($_.Name -replace '(?<=^.{140}).*$') + $_.Extension )
}
Две строки в скрипте только для отладки и журналирования.
Так вроде работает.
Но powershell также может столкнуться с ошибкой вида
Get-ChildItem : Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога - меньше 248 знаков.
Есть решение https://habr.com/ru/post/457204/
Но сам пока не применял, так как пока нет возможности перезагрузить исходный сервер.
 

Mihalich

Patron
Joined
Mar 14, 2017
Messages
297
В тоталкоммандере есть класная фича Групповое переименовывание, там можно задать число знаков в имени файла и всё что выходи за он отрезает. Это, конечно, не то решение, которое хотелось бы, но всё ж.
 

shwed

Dabbler
Joined
Mar 9, 2021
Messages
12
Ну да, тоже вариант.
Единственно, с тоталом почти не сталкивался, поэтому решил сделать на powershell тоже самое )
В тотале можно указать каталог, в котором куча подкаталогов, и так на несколько уровней, при этом неизвестно, где могут быть подобные файлы?
 

Mihalich

Patron
Joined
Mar 14, 2017
Messages
297
Точно не помню как искал длинные имена, но сейчас на гуглил плагин для тотала FileX, там в свойствах есть Длина пути и <>=.
Глубину вложения файлов так же можно задать.
 
Top