Я использую CentOS 5.5 и хотел бы перемещать большое количество папок в пределах одного тома , сохраняя их mtime
.
Лучшее решение, которое я смог найти, это:
cp -p -r source/data target/
rm -rf source/data
С более чем 1 ТБ данных на общем ресурсе NFS копирование занимает вечность. Я не хочу копировать. Я хочу мгновенного движения.
Когда я перемещаю папку с помощью mv source/data target/
, mtime
для папки (не для файлов) устанавливается текущее время. Это потому, что содержимое папки, которую я перемещаю, модифицируется этой операцией ( ..
запись указывает на другой индекс).
Я придумал следующий сценарий оболочки, который я назвал mv_preserve_mtime.sh
:
#!/bin/bash
# Moves source folder to target folder.
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2
Ну, это тоже не сработало. Папка mtime
восстанавливается, но все папки в папке, которую я перемещаю (только 1 уровень глубиной), mtime
сбрасываются по причинам, которые я не понимаю.
У кого-нибудь есть правильное, эффективное и правильное решение?
touch
не сработала? Этоmv
шаг илиtouch
шаг, который меняет mtime подкаталогов? Какая ОС находится на сервере NFS и (если вы знаете), какой тип файловой системы?mv
шаг, который вызывает проблемы. Сервер NFS на самом деле является хранилищем NetApp, я практически ничего не знаю о его внутренностях.touch
должно было работать. Кстати более портативный способ был быtouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
не был портативным.Ответы:
POSIX
mv
не предоставляет никакой возможности запрашивать сохранение atime / mtime, но, поскольку операция является локальной для того же тома, вы можете попроситьcp
использовать жесткие ссылки вместо копирования данных из обычных файлов, используя-l
опцию:Так как на самом деле будут скопированы только каталоги и ссылки на файлы, это должно идти намного быстрее:
Для получения дополнительной информации о жестких ссылках, вы можете обратиться к соответствующей странице Википедии
Что касается того, почему подкаталоги mtime сбрасываются с вашим текущим решением, это потому, что вы получаете и восстанавливаете только родительский каталог mtime: touch не является рекурсивной командой.
источник
mv
у нас нет «рекурсивной» опции, переход по подкаталогам выполняется только в том случае, если необходимо фактическое копирование (например, разных томов).mv
каталогdata
, я бы просто изменил содержимое..
in и изменил каталоги and, чтобы правильно отобразить перемещенный элемент. Никаких других каталогов не нужно было бы трогать.data
source
target
rename
реализации syscall ядром и используемой файловой системой (-ами), NFS добавляет свою долю в проблему. Есть некоторые указатели, ссылающиеся на этот тип несоответствий: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Другое решение может быть:
источник