web-dev-qa-db-ja.com

単一のtxtファイルを参照するテンプレートから複数のファイルを作成し、タッチします

cat foo.txt | xargs touchを使用してリストから空のファイルと複数の空のファイルを1回作成するためにtouchを使用しました。さらに、私は を使って複数のファイルを作成しましたか? しかし、純粋なbashを使用したファイルのリストからテンプレートを使用するファイルの作成を実装する方法を理解するのに問題があります。

Foo.txtファイルのファイル名:

cpt-one.php
cpt-two.php
cpt-three.php

template.txt:

// lots of code

touchを使用して、空のファイルを作成する代わりにtemplate.txtの内容を使用してリストからファイルを作成する方法はありますか?

bash- esqueの方法(明示的なループなし)は

  • ファイル名をシェル配列変数に読み込みます

    mapfile -t files < foo.txt
    

    またはその同義語readarray -t files < foo.txt

  • teeコマンド内の配列を展開します

    tee < template.txt -- "${files[@]}" > /dev/null
    

[> /dev/nullはオプションです-teeのデフォルトの標準出力をターミナルから隠すだけです。]

4
steeldriver

作成する必要がある数千のファイルがない限り、ブレース拡張を使用できます。

$> touch cpt-{one,two,three}.php
$> ls
cpt-one.php  cpt-three.php  cpt-two.php

目的はtemplateのクローンを作成することなので、teeを使用してstdinを複数のファイルにリダイレクトします。 teeはファイルとstdoutの両方に書き込むため、端末にエコーが表示されます

$> cat template.txt  | tee cpt-{one,two,three}.php                             
I'm template

または、while read構造体を使用できます。シェルリダイレクトを使用します。

$> rm *
$> vi inputFile.txt
$> while read FILE; do touch "$FILE" ; done < inputFile.txt
$> ls
cpt-one  cpt-three  cpt-two  inputFile.txt

これは単純な例であり、ファイルのエントリに特別な文字が含まれていないことを前提としています

さて、実際には単一のファイルを複数にコピーしたいので、同じ構造をcp /path/to/template "$FILE"に使用できます

$> ls
inputFile.txt  template.txt
$> cat template.txt                                                            
I'm template
$> while read FILE; do cp template.txt "$FILE" ; done < inputFile.txt            
$> cat cpt-one.php                                                             
I'm template
$> 
0