Mint фактически использует репозитории Ubuntu для большинства пакетов, которые вы установите. Таким образом, за исключением тех вещей, которые Mint специально переопределяет в своем собственном репозитории, Mint - это Ubuntu.
Вы можете узнать, какое программное обеспечение предоставляет сам Mint здесь: http://packages.linuxmint.com/list.php?release=Rosa . Как вы можете видеть, большинство этих пакетов связаны со средой отображения.
Вместо того, чтобы составлять список имен файлов и шаблонов в виде одной строки, вы можете сделать его массивом, начинающимся с:
list=(file1 dir1 "**.data" "**.source")
, а затем цикл по элементам:
args=()
for item in "${list[@]}" ; do
args+=(--filter="+ $item")
done
Это создаст аргументы, подобные --filter=+ file1
, без каких-либо кавычек внутри строки аргумента. (Вы не хотите, чтобы кавычки шли к rsync
. Он будет жаловаться на правило фильтрации, в котором они есть, например.rsync "--filter='+ foo'"...
)
И когда вы передаете массив команде, обязательно используйте "${args[@]}"
для передачи элементов массива в виде отдельных строк:
rsync "${args[@]}" "$srcdir" "$destdir"
Вместо "--filter=+ foo"
, я думаю, вы могли бы просто использовать --include=foo
. Это убрало бы один проблемный пробел из аргументов (, но ничего не сказало бы о пробелах или подстановках в шаблонах имен файлов ).
В вашем случае вы использовали set -f
для отключения подстановки, for i in $list
должно работать, но, поскольку вам нужен массив, вы можете использовать его для начала.
Что еще более важно, присваивание args=${arr[*]}
выравнивает массив до одной строки. Теперь пробелы внутри аргументов и пробелы между аргументами равны, есть только --filter=+ file1 --filter=+ dir1...
, и оболочка не может различать разные виды пробелов. Расширение без кавычек $args
будет разбито на все без исключения пробелы (, которые показывает вывод set -x
, если вы хотите проанализировать беспорядок кавычек.)
По сути, все выгоды от использования массива были поставлены под сомнение при выполнении этого задания.