我曾经使用过touch
创建单个空白文件和使用 plus 从列表中创建多个空白文件,cat foo.txt | xargs touch
我遇到了如何使用终端创建多个文件?但是我在弄清楚如何使用纯 bash 来实现使用文件列表中的模板来创建文件的问题。
foo.txt文件中的文件名:
cpt-one.php
cpt-two.php
cpt-three.php
模板.txt:
// lots of code
有什么方法可以使用touch
template.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
$>