массив как значение для tar --exclude

Это не производная от Debian, но вики Arch содержит информацию, которую я часто считаю полезной, представленную с нужным количеством деталей, чтобы я мог решить мои проблемы.

Если это не так, вики Debian включает список собственных производных .

2
20.01.2017, 13:34
5 ответов

В качестве альтернативы вы можете использовать переключатель - 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
1
27.01.2020, 22:03

С 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 ).

2
27.01.2020, 22:03

Каждый параметр команды представляет собой строку. Вы не можете передать массив в параметр - исключить . Вам необходимо передать несколько параметров - исключить или использовать другой метод, например - 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"
2
27.01.2020, 22:03

У меня сработало следующее:

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
0
27.01.2020, 22:03
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
0
19.05.2021, 07:52

Теги

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