Как уже упомянуто, ddrescue
и другие инструменты, которые пытаются перечитать DVD. В дополнение к этому попробуйте его различными дисками. Некоторые могут обработать царапины лучше, чем другие. С некоторой удачей можно получить полный образ DVD при использовании нескольких дисков попытаться считать дефектные части.
Наконец Вы можете удалять царапины физически. Можно купить ремонтный комплект DVD для дешевого, но я не имел большого успеха с ними. Если существует место видео DVD для сдачи в аренду около Вас, у многих из них есть устройства, которые полируют DVD и предлагают использование его за небольшую плату.
?
- это символ глобуса оболочки, используемый для сопоставления имен файлов. Он совпадает с одним символом. Таким образом, поскольку у вас есть файл с именем ab
, шаблон ?
соответствует ему.
Причина, по которой это происходит, заключается в том, что ваше расширение параметров цитируется , а не .
. Не заключенная в кавычки переменная или подстановка команды интерпретируются не как строка, а как список шаблонов подстановочных знаков имени файла. То есть значение переменной или вывод команды разбивается на отдельные части, разделенные символами в IFS
(этот шаг называется разделением полей); тогда каждая часть интерпретируется как шаблон подстановки, и если шаблон соответствует некоторым файлам, то он заменяется списком совпадающих имен файлов, в противном случае шаблон остается неизменным (этот шаг называется генерацией имени файла).
Например, status_arr = ($ (git status --porcelain -b))
устанавливает status_arr
в одноэлементный массив, содержащий 5-символьную строку ? ? ab '
, потому что IFS
содержит только новую строку и нет файла, соответствующего шаблону ?? ab
. Если IFS
имеет значение по умолчанию, содержащее пробел, тогда status_arr
будет установлен как двухэлементный массив, содержащий два вхождения двухсимвольной строки ab
.
Если подстановка переменной или команды заключена в двойные кавычки, то результирующая строка используется как есть: разделение полей и генерация имени файла применяются только к заменам без кавычек.
Вы можете полностью отключить создание имен файлов, запустив set -f
. Это полезно, если вы хотите воспользоваться преимуществом разделения IFS
. Обратите внимание, что set -f
полностью отключает создание имени файла, а не только при выводе замен: set -f; echo *
всегда печатает *
.
#!/bin/bash
IFS=$'\n'
set -f
touch ab
status_arr=( $(git status --porcelain -b) )
for (( i=0; i<${#status_arr[@]}; i++ )); do
echo "${status_arr[$i]}"
echo "${status_arr[$i]:0:2}"
done
(Здесь, когда создание имен файлов по-прежнему отключено, и, учитывая, что элементы status_arr
не могут содержать символы из IFS
по конструкции, двойные кавычки в echo
. Однако это очень хрупко - оно сильно зависит от способа создания массива и того факта, что статус set -f
и значение IFS
с тех пор не изменился. Всегда используйте двойные кавычки вокруг подстановок переменных и команд, если только у вас нет веских причин для их исключения и вы знаете, что это нормально.)