Это не производная от Debian, но вики Arch содержит информацию, которую я часто считаю полезной, представленную с нужным количеством деталей, чтобы я мог решить мои проблемы.
Если это не так, вики Debian включает список собственных производных .
В качестве альтернативы вы можете использовать переключатель - exclude-from
для работы с несколькими местоположениями
tar --exclude-from=/home/user/exclude.txt -zcvf "$FILE" "$SOURCE"
А теперь создайте файл с одним регулярным выражением для каждого линия.
cat /home/user/exclude.txt
/home/user/test1
/home/user/test2
/home/user/test3
С zsh
:
exclude=(
/home/user/test1
/home/user/test2
/home/user/test3
)
tar --exclude=$^exclude -zcvf $FILE $SOURCE
Синтаксис $ ^ exclude
расширяет приведенное выше до
tar --exclude=/home/user/test1 --exclude=/home/user/test2 \
--exclude=/home/user/test3 -zcvf the-file the-source
rc
, es
и fish
по умолчанию выполняют такую обработку с массивами, поэтому в этих оболочках вы можете сделать:
tar --exclude=$exclude -zcvf $FILE $SOURCE
(используйте set exclude / home / user / test1 / home / user / test2 / home / user / test3
для определения массива в fish
).
Каждый параметр команды представляет собой строку. Вы не можете передать массив в параметр - исключить
. Вам необходимо передать несколько параметров - исключить
или использовать другой метод, например - exclude-from
. Некоторые оболочки имеют удобный способ интерполировать массив с префиксом, добавленным к каждому элементу , но большинство (sh, bash, ksh,…) этого не делают.
Одна вещь, которая работает во всех оболочках, - это постепенное построение командной строки.
set tar -zcvf "$FILE"
set "$@" --exclude='/home/user/test1'
set "$@" --exclude='/home/user/test2'
set "$@" --exclude='/home/user/test3'
"$@" "$SOURCE"
Если вы используете bash или ksh и у вас есть массив исключаемых шаблонов, вы можете построить командную строку, перебирая массив.
exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
exclude_options=()
for x in "${exclude[@]}"; do
exclude_options+=(--exclude="$x")
done
tar -zcvf "$FILE" "${exclude_options[@]}" "$SOURCE"
В старых версиях ksh и bash отсутствует оператор + =
, поэтому для них требуется exclude_options = ("$ {exclude_options [@]}" --exclude = "$ x")
как тело цикла.
Вместо создания отдельного массива для параметров исключения вы можете создать командную строку напрямую, либо в именованной переменной массива, либо в массиве позиционных параметров.
exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
set tar -zcvf "$FILE"
for x in "${exclude[@]}"; do
set "$@" --exclude="$x"
done
"$@" "$SOURCE"
У меня сработало следующее:
gv@debi64:$ ls -l *.sh
-rwxr-xr-x 1 root root 56376 Jan 20 12:40 bashtest.sh
-rwxr-xr-x 1 root root 2682 Dec 14 17:58 cpu.sh
-rwxr-xr-x 1 root root 3661 Dec 14 17:58 greptest.sh
-rwxr-xr-x 1 root root 1215 Dec 14 17:58 iconlist.sh
-rwxr-xr-x 1 root root 22096 Jan 20 11:22 inst.sh
-rwxr-xr-x 1 root root 141 Jan 18 09:21 oneshot.sh
-rwxr-xr-x 1 root root 154 Dec 27 17:48 remove.sh
-rwxr-xr-x 1 root root 2393 Dec 14 17:58 twoscreens.sh
$ ex[0]='--exclude=cpu.sh'
$ ex[1]='--exclude=inst.sh'
$ tar "${ex[@]}" -cvf backup.tar *.sh
bashtest.sh
greptest.sh
iconlist.sh
oneshot.sh
remove.sh
twoscreens.sh
Как вы можете видеть, что файлы cpu.sh и inst.sh исключены из архива.
Точно так же вы можете построить свой массив следующим образом:
exclude[0]='--exclude=/home/user/test1'
exclude[1]='--exclude=/home/user/test2'
exclude[2]='--exclude=/home/user/test3'
В качестве альтернативы у меня также работал описанный ниже метод без необходимости хранить в массиве элементы «--exclude» впереди.
$ ex[0]='cpu.sh'
$ ex[1]='inst.sh'
$ IFS=,
$ excluded=$(eval echo "--exclude="{"${ex[*]}"})
$ unset IFS
$ tar "$excluded" -cvf backup.tar *.sh
Хитрость заключается в том, что во второй строке перед каждым элементом массива добавляется слово - excluded =
с использованием фигурных скобок без необходимости цикла в элементы массива.
Чтобы раскрытие фигурных скобок работало, элементы массива должны быть разделены запятыми, и это обеспечивается заменой IFS на запятую.
$ echo "$excluded"
--exclude=cpu.sh --exclude=inst.sh
sudo rsync -avz -e "ssh -i your-pem-key.pem" --exclude-from=folder-name-files/exclude.txt folder-name-files/ ubuntu@13.235.138.16:folder-files/
В файле exclude.txt
следует указать все игнорируемые файлы типа:
/assets
.gitignore
exclude.txt