Передать переменную в sed и заменить обратную косую черту на прямую

Если контрольные суммы неверны, данные, вероятно, неверны, и очистка дерева контрольных сумм (, что и делает --init-csum-tree), не исправит этого, она просто выставит неверные данные непосредственно в пользовательское пространство и предотвратить обнаружение любой другой битовой гнили в старых данных на FS. По сути, у вас была только одна копия данных на диске, и эта копия повреждена.таким образом, вам уже не нужно беспокоиться о том, что данные потенциально могут быть неверными в этих образах дисков, поскольку почти наверняка есть какое-то повреждение данных. Если вы получили только дюжину или около того таких сообщений об ошибках, то не будет большого повреждения (каждое из них должно соответствовать 4 -16 КБ данных, поскольку BTRFS вычисляет контрольные суммы в блоке по крайней мере, уровень ), так что это хорошо.

В этом случае я бы предложил использовать btrfs restoreдля извлечения файлов с диска в другое место или альтернативного восстановления из резервной копии. Если у вас есть только один диск и, следовательно, нет репликации данных, вы мало что можете сделать, когда получаете ошибки контрольной суммы, кроме восстановления заведомо исправных данных в новое место.

4
18.10.2019, 13:35
2 ответа

Внутри подстановки команд у вас есть "$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

9
27.01.2020, 20:46

Переменная должна быть выведена (с помощью эха )в sed. Использование sed -nдля подавления вывода sed. Редактировать-не нужно sed -n, если мы опустим флаг sed p.

#!/bin/bash

FILE='\\edi3\welshch\test'

FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH
2
27.01.2020, 20:46

Теги

Похожие вопросы