从引用单个 txt 文件的模板创建多个文件并触摸

从引用单个 txt 文件的模板创建多个文件并触摸

我曾经使用过touch创建单个空白文件和使用 plus 从列表中创建多个空白文件,cat foo.txt | xargs touch我遇到了如何使用终端创建多个文件?但是我在弄清楚如何使用纯 bash 来实现使用文件列表中的模板来创建文件的问题。

foo.txt文件中的文件名:

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

模板.txt:

// lots of code

有什么方法可以使用touchtemplate.txt 中的内容从列表中创建文件,而不是创建空白文件?

答案1

一个bash类似的方式来做到这一点(没有明确的循环)可能是

  • 将文件名读入 shell 数组变量

    mapfile -t files < foo.txt
    

    或其同义词readarray -t files < foo.txt

  • tee在命令中扩展数组

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

[> /dev/null是可选的 - 它只是隐藏了tee终端的默认标准输出。]

答案2

除非您需要创建数千个文件,否则您可以使用括号扩展:

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

由于您的目标是克隆模板,因此使用tee将标准输入重定向到多个文件。tee写入文件和标准输出,因此您将在终端上看到它的回显

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

或者,也可以使用while read结构。带有 shell 重定向。

$> 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
$> 

相关内容