scpコマンドで複数のファイルに変数を使用する方法

scpコマンドで複数のファイルに変数を使用する方法

scp複数のファイルを作成しようとしています。これにより、ls {aaa,bbb}*_list.txtオプションのファイルのみを表示できます。ただし、変数に割り当ててコマンドで使用しようとするとscp機能しません。

私は次のように試しました

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

エラーが発生します{aaa,bbb}*_list.txt: No such file or directory。ただし、エラーパス({aaa,bbb}*_list.txt)をコピーして実行すると、lsファイルが表示されます。ここに何か問題があるかもしれません。

答え1

これ支柱の拡張有効な/可能なファイルセットに拡張するには、構文に中{aaa,bbb}括弧と引用符のない文字を含める必要があります。,OPでは、 "{aaa,bbb}*_list.txt"そのままリテラル文字列として保持し、まったく拡張しないでください。

また、中かっこ拡張を変数に保存し、その変数を挿入して中括弧を拡張することは決して機能しません。なぜなら、中かっこ拡張は他のシェル拡張の前に起こるからです。つまり、中かっこが拡張されると予想すると、$files_to_scpシェルはすでに拡張に合格しています。かっこポイント

変数の使用はいいえ複数の単語をキャッチする正しい方法。ファイル名にスペースやその他のシェル特殊文字が含まれていると、ひどく失敗します。配列タイプと適切な引用符拡張を使用する

files_to_scp=({aaa,bbb}*_list.txt)

次に、結果を次のように使用します。

scp "${files_to_scp[@]}" user@host:.

答え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")
    

関連情報