Итак, я только что получил новый 4-ТБ SSHD, и у меня будет техническая установка его у меня дома до 26 мая 2015 года. Чтобы сделать резервную копию своих материалов, я купил 4-ТБ внешний диск и решил скопировать все с моего внутреннего и 3TB диски для моего 4TB диска. Я успешно скопировал 1 ТБ, но я случайно отменил передачу 3 ТБ в середине копии - когда я использовал nautilus - и я хочу проверить целостность файлов, так как я не знаю, как был заполнен мой диск 3 ТБ быстро, и я просто хочу стереть все, как только я проверил целостность. Чтобы проверить целостность, я не хочу переформатировать диск, так как здесь у меня есть несколько лишних файлов, которых нет на других дисках. Я хочу, чтобы команда анализировала путь к каждому файлу в «каталоге a», как если бы он был изолирован, а затем проверяла, что файл существует в «каталоге b» и имеет тот же хэш и размер. Если хеш отличается, размер другой, или файл не существует в «каталоге b», он скопирует файл снова. Вот пример.
Допустим, каталог A находится в / a, а каталог b в / b. Если файл размером 500 КБ имеет путь /a/eevee.png, он будет ожидать, что файл /b/eevee.png существует и равен 500 КБ с тем же хешем. Если он не существует, не имеет 500 КБ и / или имеет другую хэш-сумму, он скопирует файл и перезапишет без запроса.
Кроме того, это дополнительная функция. Если файл в каталоге a совпадает с файлом в каталоге b, как я уже говорил ранее, но метка времени отличается, то метка времени файла в директории b будет изменена на ту, которая находится в каталоге a.
Я на самом деле нашел путь с большим исследованием, не вырыл достаточно глубоко до регистрации этого. Я хотел бы сослаться на него в этом сообщении здесь (На Форумах Ubuntu, не Спросить Ubuntu). Пользователь papibe прокомментировал:
Ho jonnyboysmithy.
Это похоже на задание для 'rsync'.
По умолчанию rsync скопирует и обновит файлы на основе времени изменения и размера. Однако можно определить только для проверки размера файла.
, Например:
rsync -av --size-only source/ destination/
я надеюсь, что это помогает. Сообщите нам, как это идет. Отношения.
Вот мой сырой сценарий для проверки файлов в двух папках, и если какой-либо файл имеет проблему - копируют его. Я предложил бы использовать это после копирование по файлам.
основная идея состоит в том, чтобы использовать hexdump
для проверки файлов. Сценарий берет два каталога в качестве исходных данных. Ограничение: Это обрабатывает только файлы в каталоге, не подкаталоги (потому что я не знаю, как сделать это все же). Таким образом, можно использовать это, если у Вас нет этого многими папками, но если у Вас есть несколько папок и подпапок, под управлением сценарий вручную для каждого каталога может быть утомительным. Еда для будущего думала: создают список папок и подпапок для источника и места назначения, и затем автоматизируют сценарий, проходящий два списка.
Сценарий в Действии
у меня есть tester2 как исходный каталог и testerdir как место назначения, где я уже скопировал файлы. На строке 123 я выполняю сценарий для проверки файлов, скопированных. На строке 124 я изменяюсь, содержание tester2/hello файла (измените его содержание от "ТЕСТА" до "ТЕСТЕРА"). На строке 125 Вы видите, что сценарий обнаруживает тот файл, привет был изменен/изменен в размере/повреждении и копирует файл снова. В строке 126 Вы видите, что я проверяю что привет файл в соответствиях папки назначения та из исходной папки.
Сценарий
#!/bin/bash
# Author: Serg Kolo
# Date: Mon May 25 01:19:59 MDT 2015
# Description: script to verify files in two directories
# written for http://askubuntu.com/q/627817/295286
copy_the_file ()
{
cp -f "$SOURCE_DIR"/"$filename" "$DEST_DIR"/"$filename"
}
if [ $# -ne 2 ]; then
printf "Usage: verify-files.sh SOURCE_DIR DEST_DIR"
exit 1
fi
SOURCE_DIR="$1"
DEST_DIR="$2"
IFS=":"
for filename in $(find "$SOURCE_DIR" -maxdepth 1 -type f -printf "%f:" | sed 's/.\///g' )
do
#echo "$filename"
#echo "$DEST_DIR"/"$filename"
if [ -e "$DEST_DIR"/"$filename" ];then
hexdump "$SOURCE_DIR"/"$filename" > .dump1
hexdump "$DEST_DIR"/"$filename" > .dump2
diff .dump1 .dump2 > /dev/null
if [ $? -eq 0 ];then
echo " "$filename" is OK "
else
echo ""$filename" has a problem"
copy_the_file
fi
else
copy_the_file
fi
done