我尝试使用 for 循环从命令行复制视频文件 x 次,我已经尝试过这样的操作,但它不起作用:
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
答案1
您的 shell 代码有两个问题:
- 不
echo
应该在那里。 - 目标文件名中的变量
$i
(“dollar i”)被错误地输入为(“dollar one”)。$1
要在与文件本身相同的目录中创建文件的副本,请使用
cp thefile thecopy
如果您使用两个以上的参数,例如
cp thefile theotherthing thecopy
那么就是假定您想要复制thefile
并theotherthing
进入目录叫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