man rsync
--exclude=PATTERN exclude files matching PATTERN
--exclude-from=FILE read exclude patterns from FILE
exclude -from используется для указания на файл, в котором перечислены папки, которые вам не нужны. Попробуйте вариант --исключить
Ваша переменная(files_to_scp
)содержит буквальную строку "{aaa,bbb}*_list.txt"
, НЕ расширение всех соответствующих файлов. bash не раскрывает фигурные скобки при присвоении скалярной переменной.
bash расширяет их для массивов. Вместо этого используйте массив.
напр.
files_to_scp=( {aaa,bbb}*_list.txt )
scp "${files_to_scp[@]}" user@host:.
Вот (упрощенный, практический )пример и объяснение, показывающее, что происходит:
Я создал кучу файлов, соответствующих вашему шаблону
$ mkdir spike
$ cd spike
$ touch {aaa,bbb}{01..10}_list.txt
$ ls
aaa01_list.txt aaa05_list.txt aaa09_list.txt bbb03_list.txt bbb07_list.txt
aaa02_list.txt aaa06_list.txt aaa10_list.txt bbb04_list.txt bbb08_list.txt
aaa03_list.txt aaa07_list.txt bbb01_list.txt bbb05_list.txt bbb09_list.txt
aaa04_list.txt aaa08_list.txt bbb02_list.txt bbb06_list.txt bbb10_list.txt
ваше назначение переменной сохраняет литеральную строку:
$ files_to_scp="{aaa,bbb}*_list.txt"
$ declare -p files_to_scp
declare -- files_to_scp="{aaa,bbb}*_list.txt"
и bash делает то же самое без кавычек:
$ files_to_scp={aaa,bbb}*_list.txt
$ declare -p files_to_scp
declare -- files_to_scp="{aaa,bbb}*_list.txt"
при использовании массива каждое совпадающее имя файла сохраняется как элемент массива.
$ files_to_scp=( {aaa,bbb}*_list.txt )
$ declare -p files_to_scp
declare -a files_to_scp=([0]="aaa01_list.txt" [1]="aaa02_list.txt" [2]="aaa03_list.txt" [3]="aaa04_list.txt" [4]="aaa05_list.txt" [5]="aaa06_list.txt" [6]="aaa07_list.txt" [7]="aaa08_list.txt" [8]="aaa09_list.txt" [9]="aaa10_list.txt" [10]="bbb01_list.txt" [11]="bbb02_list.txt" [12]="bbb03_list.txt" [13]="bbb04_list.txt" [14]="bbb05_list.txt" [15]="bbb06_list.txt" [16]="bbb07_list.txt" [17]="bbb08_list.txt" [18]="bbb09_list.txt" [19]="bbb10_list.txt")
Синтаксис {aaa,bbb}
расширения фигурных скобок {aaa,bbb}
должен содержать фигурные скобки и символ ,
, которые не должны быть заключены в кавычки, чтобы он расширялся до действительного/возможного набора файлов. В OP "{aaa,bbb}*_list.txt"
сохраняется как литеральная строка и вообще не расширяется.
Кроме того, сохранение раскрытия скобки в переменной и интерполяция этой переменной для раскрытия скобки никогда не будет работать, потому что раскрытие скобки происходит до любых других раскрытий оболочки, т. е. к тому времени, когда вы ожидаете, что $files_to_scp
будет раскрыто скобку, оболочка уже пересекла точку, где она могла бы развернуть распорки
Использование переменной не правильный подход к хранению нескольких слов. Если у вас есть имена файлов, содержащие пробелы или другие специальные символы оболочки, произойдет сбой. Используйте тип массива и правильное раскрытие в кавычках
files_to_scp=({aaa,bbb}*_list.txt)
и теперь используйте результат как
scp "${files_to_scp[@]}" user@host:.