![使用命令行制作单个文件的多个副本的替代解决方案?](https://linux22.com/image/84503/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%88%B6%E4%BD%9C%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%89%AF%E6%9C%AC%E7%9A%84%E6%9B%BF%E4%BB%A3%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9F.png)
我正在尝试将一个文件复制到 10 个文件。举例来说,我有一封名为 的电子邮件test1.eml
。我想要同一个文件的 10 个副本。
当我在互联网上搜索时,我遇到了这个 stackoverflow 线程https://stackoverflow.com/questions/9550540/linux-commands-to-copy-one-file-to-many-files并遵循社区成员之一“knittl”提到的 eval 命令。
eval 'cp test1.eml 'test{2..10}.eml';'
上面提到的命令有效并且满足了我的要求。是否有其他替代/更优雅的命令来实现此目的,因为提到 eval 命令的人告诉我这是一种肮脏的黑客行为。
答案1
我会做类似的事情,for i in {2..10}; do cp test1.eml test$i.eml; done
但或多或少是相同的事情。
答案2
tee >test2.eml test{3..10}.eml < test1.xml
只会读取一次源代码并只执行一个命令。对于大文件来说,它可能不会更有效,并且可能会鼓励碎片,因为tee
会依次在每个输出文件中写入数据块。它还根据您当前的 umask 创建具有权限的文件,而不是像cp
根据选项那样部分或完全复制原始权限。
如果你想节省打字,只需使用zsh
你的 shell(顺便说一句,这就是这些{2..10}
构造的来源)
for f (test{2..10}.eml)cp test1.eml $f
这和你的一样短:
eval 'cp test1.eml 'test{2..10}.eml';'
但更直观/清晰,更容易推广到具有更多问题字符的文件名。
假设zsh
您没有禁用该multios
选项,您还可以执行以下操作:
<test1.eml >test{2..10}.eml
在那里,zsh
执行内部操作tee
并调用cat
.所以它的效率比该方法稍低tee
。