10

Я использую 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 по причинам, которые я не понимаю.

У кого-нибудь есть правильное, эффективное и правильное решение?

2 ответа2

13

POSIX mv не предоставляет никакой возможности запрашивать сохранение atime/mtime, но, поскольку операция локальна для того же тома, вы можете попросить cp использовать жесткие ссылки вместо копирования данных обычных файлов с помощью опции -l :

cp -p -r -l source/date target/
rm -rf source/data

Так как на самом деле будут скопированы только каталоги и ссылки на файлы, все должно выполняться намного быстрее:

Для получения дополнительной информации о жестких ссылках, вы можете обратиться к соответствующей странице Википедии

Что касается того, почему подкаталоги mtime сбрасываются с вашим текущим решением, это потому, что вы только получаете и восстанавливаете родительский каталог mtime: touch не является рекурсивной командой.

3

Другое решение может быть:

rsync -a --remove-source-files источник / цель данных /

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .