在命令 shell 中重复文件 x 次

在命令 shell 中重复文件 x 次

我尝试使用 for 循环从命令行复制视频文件 x 次,我已经尝试过这样的操作,但它不起作用:

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done

答案1

您的 shell 代码有两个问题:

  1. echo应该在那里。
  2. 目标文件名中的变量$i(“dollar i”)被错误地输入为(“dollar one”)。$1

要在与文件本身相同的目录中创建文件的副本,请使用

cp thefile thecopy

如果您使用两个以上的参数,例如

cp thefile theotherthing thecopy

那么就是假定您想要复制thefiletheotherthing进入目录thecopy.

在您的情况下cp test.ogg echo "test$1.ogg",它专门查找一个名为 的文件test.ogg并将一个名为 的echo文件复制到目录中test$1.ogg

$1有可能扩展为空字符串。这就是为什么当您echo从命令中删除时,您会得到“test.ogg 和 test.ogg 是相同的文件”;正在执行的命令本质上是

cp test.ogg test.ogg

这很可能是一个错误的输入。

最后,你想要这样的东西:

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

或者,作为替代方案

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

或者,使用tee

tee test{1..100}.ogg <test.ogg >/dev/null

注意:这很可能适用于 100 个副本,但对于数千个副本,可能会生成“参数列表太长”错误。在这种情况下,请恢复使用循环。

答案2

for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done

答案3

简短而精确

< test.ogg tee test{1..100}.ogg

或者更好地做

tee test{1..100}.ogg < test.ogg >/dev/null

tee命令用法寻求更多帮助。

更新

正如@Gilles 所建议的,使用tee具有不保留任何文件元数据的缺陷。要解决该问题,您可能必须在此之后运行以下命令:

cp --attributes-only --preserve Source Target

答案4

您在复制时没有调用变量 i

使用下面的脚本。经测试,效果很好

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done

相关内容