Как использовать переменную в команде scp для нескольких файлов

man rsync

--exclude=PATTERN       exclude files matching PATTERN
--exclude-from=FILE     read exclude patterns from FILE

exclude -from используется для указания на файл, в котором перечислены папки, которые вам не нужны. Попробуйте вариант --исключить

1
22.08.2019, 10:43
2 ответа

Ваша переменная(files_to_scp)содержит буквальную строку "{aaa,bbb}*_list.txt", НЕ расширение всех соответствующих файлов. bash не раскрывает фигурные скобки при присвоении скалярной переменной.

Однако

bash расширяет их для массивов. Вместо этого используйте массив.

напр.

files_to_scp=( {aaa,bbb}*_list.txt )
scp "${files_to_scp[@]}" user@host:.

Вот (упрощенный, практический )пример и объяснение, показывающее, что происходит:

  1. Я создал кучу файлов, соответствующих вашему шаблону

    $ 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
    
  2. ваше назначение переменной сохраняет литеральную строку:

    $ files_to_scp="{aaa,bbb}*_list.txt"
    $ declare -p files_to_scp
    declare -- files_to_scp="{aaa,bbb}*_list.txt"
    
  3. и bash делает то же самое без кавычек:

    $ files_to_scp={aaa,bbb}*_list.txt
    $ declare -p files_to_scp
    declare -- files_to_scp="{aaa,bbb}*_list.txt"
    
  4. при использовании массива каждое совпадающее имя файла сохраняется как элемент массива.

    $ 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")
    
1
27.01.2020, 23:15

Синтаксис {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:.
4
27.01.2020, 23:15

Теги

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