LINUX.ORG.RU

Копирование папки с сохранением дат изменения файлов

 , , ,


1

1

Добрый день!
Есть обычный ЖД, смонтированный через /etc/fstab:

LABEL=Data   /mnt/Data    auto    auto,user,exec,rw   0   2 
Есть сетевой NAS, смонтированный через /etc/fstab:
//192.168.1.30/Disk1share  /mnt/NAS/NasDisk cifs auto,user,exec,rw,uid=1000,iocharset=utf8,username=admin,password=НеСкажу 0   0  

Задача - скопировать папку с ЖД на NAS и всё, что внутри неё так, чтобы каждый файл сохранил свою дату изменения. Дата создания при этом не имеет значения.
При копировании с ЖД на ЖД хоть целиком папки, хоть по одному файлу всё ОК.
При копировании с ЖД на NAS по одному файлу - всё ОК.
При копировании с ЖД на NAS сразу всей папки - всё плохо, т.к., вместо даты изменения устаналивается текущая дата ПК. А это очень плохо, так как Meld потом сходит с ума при сравнении.

ЧЯДНТ? Спасибо заранее

P.S. Копировать пробовал через cp, mc, dolphin и doublecmd - везде примерно одинаковая картина
Уже по советам темы, пробовал копировать через rsync, а также через архивирование-разархивирование tar. Аналогично не работает

Ответ на: комментарий от aaaSashaMGGU

Значит и cp -a будет работать. Уверен ты cp с другими опциями запускал

$ strace -e utimensat touch -d 'Jan 25 8:30 2021' ccc
utimensat(0, NULL, [{tv_sec=1611556200, tv_nsec=0} /* 2021-01-25T08:30:00+0200 */, {tv_sec=1611556200, tv_nsec=0} /* 2021-01-25T08:30:00+0200 */], 0) = 0

$ strace -e utimensat cp -a ccc bbb
utimensat(4, NULL, [{tv_sec=1611556200, tv_nsec=0} /* 2021-01-25T08:30:00+0200 */, {tv_sec=1611556200, tv_nsec=0} /* 2021-01-25T08:30:00+0200 */], 0) = 0
futurama ★★★★★ ()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от futurama

С ЖД на ЖД:

ls -l /mnt/Data/111/111.txt
-rw-r--r-- 1 aaasashamggu aaasashamggu 583 апр 29 00:22 /mnt/Data/111/111.txt
cp -a /mnt/Data/111 /mnt/Data/222                               
ls -l /mnt/Data/222/111/111.txt                                 
-rw-r--r-- 1 aaasashamggu aaasashamggu 583 апр 29 00:22 /mnt/Data/222/111/111.txt

С ЖД на NAS:

/mnt/Data/111  ls -l /mnt/Data/222/111/111.txt
-rw-r--r-- 1 aaasashamggu aaasashamggu 583 апр 29 00:22 /mnt/Data/222/111/111.txt
cp -a /mnt/Data/111 /mnt/NAS/NasDisk/Data                       
ls -l /mnt/NAS/NasDisk/Data/111/111.txt                         
-rwxr-xr-x 1 aaasashamggu root 583 мая  1 20:51 /mnt/NAS/NasDisk/Data/111/111.txt

aaaSashaMGGU ()
Ответ на: комментарий от futurama

Да я думал уже, что нужно просто синхронизировать дату/время. Но это ж костыли те ещё...
Каждый раз после копирования запускать некий скрипт, обновляющий дату-время. Помнить про это всегда. Meld опять же научить это делать. Бррр...
В конце-концов, как я уже говорил, копируя просто файлы (не папки), всё хорошо. Просто файлов много, копировать по одному MSDOS какой-то начинается.
Странно всё это

aaaSashaMGGU ()
Ответ на: комментарий от futurama
strace -e utimensat cp -a /mnt/Data/111 /mnt/NAS/NasDisk/Data                                  
utimensat(4, NULL, [{tv_sec=1651423727, tv_nsec=0} /* 2022-05-01T19:48:47+0300 */, {tv_sec=1651180958, tv_nsec=0} /* 2022-04-29T00:22:38+0300 */], 0) = 0
utimensat(AT_FDCWD, "/mnt/NAS/NasDisk/Data/111", [{tv_sec=1651428170, tv_nsec=89196566} /* 2022-05-01T21:02:50.089196566+0300 */, {tv_sec=1651428170, tv_nsec=85863232} /* 2022-05-01T21:02:50.085863232+0300 */], 0) = 0
+++ exited with 0 +++
aaaSashaMGGU ()
Ответ на: комментарий от futurama

С ЖД на ЖД:

strace -e utimensat cp -a /mnt/Data/111 /mnt/Data/222                                                                           
utimensat(4, NULL, [{tv_sec=1651428262, tv_nsec=692528672} /* 2022-05-01T21:04:22.692528672+0300 */, {tv_sec=1651180958, tv_nsec=0} /* 2022-04-29T00:22:38+0300 */], 0) = 0
utimensat(AT_FDCWD, "/mnt/Data/222/111", [{tv_sec=1651428170, tv_nsec=89196566} /* 2022-05-01T21:02:50.089196566+0300 */, {tv_sec=1651428170, tv_nsec=85863232} /* 2022-05-01T21:02:50.085863232+0300 */], 0) = 0

aaaSashaMGGU ()

Ну, не могут сразу абсолютно все программы разом поломаться. Проблема, как мне кажется, общая где-то на уровне системы. Возможно, в монтировании, возможно в чём-то ещё

aaaSashaMGGU ()

Подолью масла в огонь.
Запустил VirtualBox с Windows10. Там стандартным образом подключил 2 сетевых диска: ЖД (q:\) и NAS (n:\). Скопировал папку через виндовый DoubleCommander.
И всё ОК. Windows работает как надо

aaaSashaMGGU ()
Ответ на: комментарий от aaaSashaMGGU

По-моему самый удобный способ, у меня всегда везде работал. Хоть это и костыль, но cp склонен терять то одно то другое по дороге если ему кучу опций не задать.

tar -c -f - -C /mnt/Data 111 | tar -x -f - -C /mnt/NAS/NasDisk/Data

firkax ★★ ()
Ответ на: комментарий от firkax

Внезапно, это тоже не работает

tar -c -f - -C /mnt/Data 111 | tar -x -f - -C /mnt/NAS/NasDisk/Data  
ls -l /mnt/NAS/NasDisk/Data/111/111.txt                                                                    
-rwxr-xr-x 1 aaasashamggu root 583 мая  2  2022 /mnt/NAS/NasDisk/Data/111/111.txt
ls -l /mnt/Data/111/111.txt                                                                                
-rw-r--r-- 1 aaasashamggu aaasashamggu 583 апр 29 00:22 /mnt/Data/111/111.txt

aaaSashaMGGU ()
Ответ на: комментарий от aaaSashaMGGU

Попробуй что-нить тяжёлое так перенести, чтобы копирование длилось хотя бы минуту и чтобы там было несколько файлов (все большие, ну или хотя бы несколько). И потом посмотри даты у всех.

Например так:

mkdir /mnt/Data/test
dd if=/dev/zero of=/mnt/Data/test/1.dat bs=1048576 count=1000
dd if=/dev/zero of=/mnt/Data/test/2.dat bs=1048576 count=1000
dd if=/dev/zero of=/mnt/Data/test/3.dat bs=1048576 count=1000
dd if=/dev/zero of=/mnt/Data/test/4.dat bs=1048576 count=1000
dd if=/dev/zero of=/mnt/Data/test/5.dat bs=1048576 count=1000
dd if=/dev/zero of=/mnt/Data/test/6.dat bs=1048576 count=1000
touch -t 01010000 /mnt/Data/test/*
tar -c -f - -C /mnt/Data test | tar -x -f - -C /mnt/NAS/NasDisk/Data
ls -al /mnt/NAS/NasDisk/Data/test

firkax ★★ ()
Ответ на: комментарий от firkax

Не работает

tar -c -f - -C /mnt/Data test | tar -x -f - -C /mnt/NAS/NasDisk/Data
ls -al /mnt/NAS/NasDisk/Data/test                                                              
итого 6150144
drwxr-xr-x 2 aaasashamggu root          0 мая  2 03:07 .
drwxr-xr-x 2 aaasashamggu root          0 мая  2 03:10 ..
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:12 1.dat
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:19 2.dat
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:21 3.dat
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:14 4.dat
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:15 5.dat
-rwxr-xr-x 1 aaasashamggu root 1048576000 мая  2 03:17 6.dat

aaaSashaMGGU ()
Ответ на: комментарий от greenman

Мда, проблеме >10 лет уже
Если что - я уже скопировал все свои ~20000 файлов через VirtualBox. Дальше Meld если и будет находить различия - он уже пофайлово сам заменит изменения (а пофайловая замена дату не ломает), что, в целом, меня устраивает
Хотя, ситуация всё равно весьма странная

aaaSashaMGGU ()
Ответ на: комментарий от aaaSashaMGGU

Заметил, что у всех файлов на NAS права 755. И сменить их нельзя. Т. е., вроде бы всё меняется, но потом права «прыгают» обратно.

ls -l /mnt/NAS/NasDisk/Data/111/default.pa                                                                 
-rwxr-xr-x 1 aaasashamggu root 5274 янв  1 00:00 /mnt/NAS/NasDisk/Data/111/default.pa
chmod 777 /mnt/NAS/NasDisk/Data/111/default.pa
ls -l /mnt/NAS/NasDisk/Data/111/default.pa                                                                 
-rwxr-xr-x 1 aaasashamggu root 5274 янв  1 00:00 /mnt/NAS/NasDisk/Data/111/default.pa

Нашёл интересный вариант:
1) Открываем Double Commander
2) Выбираем меню «Сеть» --- «Соединиться с сервером»
3) Пишем в адресной строке «smb://192.168.1.30/Disk1share», вводим логин и пароль от NAS
Ииииииии всё работает, при копировании папок целиком дата копируется корректно...
В dolphine тоже так работает

В связи с этим вопрос: может быть, можно ли как-то через Самбу ещё при загрузке системы приконнектить NAS в папку без этих ваших явно поломанных cifs-ов в /etc/fstab?

aaaSashaMGGU ()
Ответ на: комментарий от aaaSashaMGGU

В принципе, Double Commander тут вообще ни при чём. При обычном (ручном) монтировании всё тоже работает как надо:

sudo mount -t cifs //192.168.1.30/Disk1share /mnt/Data/222 -o user=aaa
Password for aaa@//192.168.1.30/Disk1share:

aaaSashaMGGU ()

Решение родилось в соседней теме https://www.linux.org.ru/forum/general/16859925?lastmod=1651600721267
Нужно было в параметры добавить другую версию Самбы "vers=2.0"
Файл /etc/fstab:

//192.168.1.30/Disk1share /mnt/NAS/NasDisk cifs auto,user,exec,rw,uid=1000,iocharset=utf8,vers=2.0,username=ТипаТелефон,password=1234 0 0

Спасибо пользователю Beewek за верную наводку!

aaaSashaMGGU ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.