Я сделал бэкап директории, которая на винде через ssh. От rsync пришлось отказаться, так как она плохо работала с длинными путями к файлам. Поэтому на стороне винды использовал syncovery. Файлы бэкапятся по ssh на линуксовый ext4 раздел.
На компе, откуда они бэкапятся, любили давать файлом максимально длинные имена. Таким образом, там есть файлы, у которых имя состоит из 255 символов. Причем, в кириллице. Винда там - семерка.
И все отработало на вид нормально! Но. Получилось, что имя файла занимает больше 255 байт, а ограничение ext4 - 255 байт.
Я не знаю, почему оно работает и где хранит «лишние» байты названия. Как оно сохранило такие длинные имена файлов - затрудняюсь ответить. По ls они выводятся нормально. cat,rm работает (и на том спасибо). Но скопировать их невозможно: слишком длинное имя. Перенаправить вывод cat в файл с таким длинным именем - не получается. rsync тоже не работает. Я даже подебажил немножко и выяснил, что фейлится системный вызов lstat, с ошибкой - слишком длинное имя.
Так же, под линуксом невозможно обычными средствами создать такой файл:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
int fd = open("однажды в студенную зимнюю пору я из лесу вышел был сильный мороз. Раз два три. проба проба это проба. проба расского текста длинный файл букв", O_RDWR|O_CREAT, 0777);
}
Как создаются эти файлы при копировании через ssh - загадка. Наверное, ssh использует не open, а что-то другое.
Вопросы: Насколько опасно иметь такие длинные файлы? Не может ли это повредить ext4? Как бы их все же скопировать? Хотелось раз в неделю делать rsync в другой каталог, и он делается, но файлы с длинными именами игнорируются. Почему лажает вызов lstat? Что вообще происходит? Это какая-то лажа, так быть не должно.