Поведение `$ @` против `$ *` [дубликат]

Вы используете флаг -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.

В качестве ссылки: Поиск поврежденных файлов

0
26.11.2018, 23:10
3 ответа

Разница возникает, когда у вас есть аргументы, которые вы передаете в командной строке с символами 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!

Как видите, есть разные варианты поведения.

3
28.01.2020, 02:15

Попробуйте это:

#!/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.

3
28.01.2020, 02:15
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(только для первого символа )для разграничения элементов в строке, полученной в результате расширения.

0
28.01.2020, 02:15

Теги

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