Вы используете флаг -i
, который в своей длинной форме имеет вид --ignore-zeros
.
Вот почему tar не жалуется на поврежденные файлы.
Итак, если вы хотите отладить свой tar-файл, просто удалите опцию -i
, и вы получите список поврежденных файлов.
Есть также 2 других способа найти поврежденные файлы в Unix (в целом). Я цитирую ответ, данный в другом вопросе.
rsync может использоваться для копирования каталогов и способен перезапускать копию с точки, в которой она была прервана, если какая-либо ошибка приводит к прекращению работы rsync.
Используя опцию rsync
--dry-run
, вы можете увидеть, что будет скопировано, ничего не копируя. Опции--stats
и--progress
также будут полезны. и--человекочитаемый
или-h
легче читать.напр.
rsync --dry-run -avh --stats --progress /path/to/src/ /path/to/destination/
Я не уверен, установлен ли rsync по умолчанию в Mac OS X, но я использовал его на Mac, поэтому я знаю, что он определенно доступен.
Для быстрой проверки возможности чтения файлов в подкаталоге вы можете использовать
grep -r XXX /path/to/directory/ > /dev/null
. Регулярное выражение поиска не имеет значения, потому что вывод все равно отбрасывается.STDOUT перенаправляется на /dev/null, поэтому вы увидите только ошибки.
Единственная причина, по которой я выбрал здесь grep, заключалась в его опции рекурсии
-R
.Есть много других команд, которые можно использовать вместо grep здесь и даже больше, если используется с find.
В качестве ссылки: Поиск поврежденных файлов
Разница возникает, когда у вас есть аргументы, которые вы передаете в командной строке с символами IFS в них (, например. аргумент с пробелом ). Чтобы увидеть разницу, посмотрите на этот скрипт:
#!/bin/bash
echo 'Here is $*'
for x in "$*"; do
echo " !${x}!"
done
echo ""
echo 'And here is $@'
for x in "$@"; do
echo " !${x}!"
done
exit 0
Теперь посмотрите на разницу, когда вы передаете аргумент с пробелом.
./testspace01.sh "This is" a test
Here is $*
!This is a test!
And here is $@
!This is!
!a!
!test!
ОБНОВЛЕНИЕ Ах, назначение того, что было передано в командной строке, переменной, приносит свои маленькие причуды.:)
Помните, что все, что было передано в командной строке, является массивом. Таким образом, присвоение массива строке дает вам нечто иное, чем подписание массива. И обработка массива отличается в зависимости от того, используете ли вы звездочку или звездочку. Вот обновленная версия моего скрипта.
#!/bin/bash
s_star="$*"
echo 'Here is s_star'
for x in "${s_star}"; do
echo " !${x}!"
done
a_star=("$*")
echo ""
echo 'Here is a_star'
for x in "${a_star}"; do
echo " !${x}!"
done
s_at="$@"
echo ""
echo 'Here is s_at'
for x in "${s_at}"; do
echo " !${x}!"
done
a_at=("$@")
echo ""
echo 'Here is a_at (using star)'
for x in "${a_at[*]}"; do
echo " !${x}!"
done
echo ""
echo 'Here is a_at (using at)'
for x in "${a_at[@]}"; do
echo " !${x}!"
done
exit 0
Вот результат:
./testspace02.sh "This is" a test
Here is s_star
!This is a test!
Here is a_star
!This is a test!
Here is s_at
!This is a test!
Here is a_at (using star)
!This is a test!
Here is a_at (using at)
!This is!
!a!
!test!
Как видите, есть разные варианты поведения.
Попробуйте это:
#!/bin/bash
show-difference () {
for e in "$@" ; do
printf '<%s>\n' "$e"
done
for e in "$*" ; do
printf '[%s]\n' "$e"
done
}
show-difference {a..h}
Выход:
<a>
<b>
<c>
<d>
<e>
<f>
<g>
<h>
[a b c d e f g h]
"$*"
— это одно слово, а "$@"
расширяется до всех параметров как отдельных слов. Более того, "$@"
работает правильно, даже если аргументы содержат первый символ IFS.
set -- "hello there" bumblebee
printf '%s\n' "$@"
printf '%s\n' "$*"
Результат:
hello there
bumblebee
, а затем
hello there bumblebee
Это показывает, что "$@"
генерирует список отдельных элементов в кавычках, а "$*"
генерирует одну строку в кавычках.
Используя bash
, это также можно проиллюстрировать с помощью короткого сценария оболочки, который принимает ряд аргументов командной строки:
#!/bin/bash
IFS='_'
atarray=( "$@" )
stararray=( "$*" )
printf 'at: %s\n' "${atarray[@]}"
printf 'star: %s\n' "${stararray[@]}"
Запуск:
$ bash./script.sh "one two" three four
at: one two
at: three
at: four
star: one two_three_four
Это также показывает, что использование "$*"
будет использовать значение в$IFS
(только для первого символа )для разграничения элементов в строке, полученной в результате расширения.