У меня есть ситуация, когда я тестирую новую файловую систему, у которой есть проблема с некоторыми метаданными. Все файлы не повреждены, однако в конечном итоге мне приходится эффективно перемещать каждый файл на другой том, а затем немедленно возвращаться на место.
Очевидно mv
не поможет, поскольку не может сохранить все атрибуты (особенно все временные метки). Я думал о чем-то более похожем на команду find во время выполнения cp -p /original/path/to/file /tmp/location/file
, rm /original/path/to/file
, cp -p /tmp/location/file /original/path/to/file
, rm /tmp/location/file
. Возможно, все эти команды в сценарии передаются в команду find exec?
Я не уверен в наиболее эффективном подходе здесь, но хотел бы получить быстрый ввод, чтобы убедиться, что я охватил все свои базы и имел точную команду, которая не оставит меня оплакивать какую-то потерю атрибутов данных, когда все сказано и готово. У меня есть много сотен гигабайт, которые нужно перемещать вперед и назад, поэтому мне нужно быть как можно более осторожным и эффективным.
Вот решение, которое я придумал до сих пор, и мне очень хотелось бы внести свой вклад:
Сценарий оболочки safe_move.sh
:
#!/usr/bin/env bash
SRC_FILE_AND_PATH="$1"
SRC_BASENAME=`basename "$1"`
DESTINATION_PATH="/mnt/tmp"
cp -a ${SRC_FILE_AND_PATH} ${DESTINATION_PATH}/${SRC_BASENAME}
rm -f ${SRC_FILE_AND_PATH}
cp -a ${DESTINATION_PATH}/${SRC_BASENAME} ${SRC_FILE_AND_PATH}
rm -f ${DESTINATION_PATH}/${SRC_BASENAME}
И это будет вызываться с помощью:
find /path/to/move -type f -exec safe_move.sh {} \;
Я заметил, что вы отметили это тегом FreeBSD. Если FreeBSD - ваша ОС, тогда
dump -0 -f /path/to/destination/file /what/to/dump
Вам понадобятся другие команды:
newfs /dev/ada0p1
mount /dev/ada0p1 /mnt
cd /mnt
restore -r -f /path/to/destination/file
Вы хотите заменить эти узлы устройств на те, которые подходят для вашей системы. Кроме того, вы хотите придерживаться дампа целых разделов и избегать сброса частей раздела.
Рассмотрите возможность использования tar
с участием -p
(--preserve
). Таким образом, у вас также будет хороший архив, который можно держать под рукой ... ну ... на всякий случай. Я не знаю никаких метаданных, которые могли бы остаться позади. Я также снимаю с себя ответственность, если обнаружу, что ошибаюсь. знак равно
РЕДАКТИРОВАТЬ: даты символических ссылок не будут сохранены! Видеть?! Никогда не доверяйте коту с привилегиями root.
Другие варианты включают cplv
но у вас нет группы томов, по крайней мере, равной размеру источника. cpdup
слишком. Если все это в одной группе томов, rsync
может быть вариантом.
Я обнаружил, что rsync в конечном итоге очень хорошо справляется с задачей, за исключением того, что вам нужно удалить оставшиеся папки, которые оставляет процесс. К сожалению, поскольку папки занимают очень мало места, им можно пренебречь, и rm приемлемо:
rsync -axvES --remove-source-files src_folder /dst_folder/
rsync -axvES --remove-source-files /old_dst_folder ./