Если контрольные суммы неверны, данные, вероятно, неверны, и очистка дерева контрольных сумм (, что и делает --init-csum-tree
), не исправит этого, она просто выставит неверные данные непосредственно в пользовательское пространство и предотвратить обнаружение любой другой битовой гнили в старых данных на FS. По сути, у вас была только одна копия данных на диске, и эта копия повреждена.таким образом, вам уже не нужно беспокоиться о том, что данные потенциально могут быть неверными в этих образах дисков, поскольку почти наверняка есть какое-то повреждение данных. Если вы получили только дюжину или около того таких сообщений об ошибках, то не будет большого повреждения (каждое из них должно соответствовать 4 -16 КБ данных, поскольку BTRFS вычисляет контрольные суммы в блоке по крайней мере, уровень ), так что это хорошо.
В этом случае я бы предложил использовать btrfs restore
для извлечения файлов с диска в другое место или альтернативного восстановления из резервной копии. Если у вас есть только один диск и, следовательно, нет репликации данных, вы мало что можете сделать, когда получаете ошибки контрольной суммы, кроме восстановления заведомо исправных данных в новое место.
Внутри подстановки команд у вас есть "$FILE" | sed -e 's/\\/\//gp'
, которую оболочка расширяет до (, эквивалентной)'\\edi3\welshch\test' | sed -e 's/\\/\//gp'
. Поскольку это команда , оболочка ищет файл с именем \\edi3\welshch\test
для запуска.
Вероятно, вы хотели использовать echo "$FILE" | sed...
для передачи содержимого FILE
в sed
по конвейеру.
Обратите внимание, что даже это неправильно, некоторые версии echo
будут обрабатывать обратную косую черту как escape-символы, что приводит к путанице. Вам понадобится printf "%s\n" "$FILE" | sed...
, чтобы он работал во всех оболочках. См.:Почему printf лучше, чем echo?
Кроме того, обратите внимание, что поведение sed
по умолчанию заключается в печати строки после любых операций, которые она выполняет. Когда вы используете /p
в команде s///
, это вызывает дополнительную печать, поэтому вы получаете результат дважды на выходе.
Тем не менее, поскольку вы используете Bash, вы можете просто использовать расширение замены строки:
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"
дает результат//edi3/welshch/test
Переменная должна быть выведена (с помощью эха )в sed. Использование sed -n
для подавления вывода sed. Редактировать-не нужно sed -n
, если мы опустим флаг sed p
.
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH