Answers:
您的外壳程序代码有两个问题:
echo
不应该存在。$i
类型$1
与目标文件名相同。要在与文件本身相同的目录中复制文件,请使用
cp thefile thecopy
如果您在其中插入其他任何内容,例如
cp thefile theotherthing thecopy
那么假设您要复制thefile
并复制theotherthing
到名为的目录中thecopy
。
在您的情况下,它专门查找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个副本,但是对于数千个副本,则可能会生成“参数列表过长”错误。在这种情况下,请还原为使用循环。
简短而精确
< 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
cp
(取决于相对于可用内存的文件大小),但是存在不保留任何文件元数据的缺陷。
cp --attributes-only
随后运行。
cp -p
保存元数据。
您在复制时尚未调用变量i
使用以下脚本。经测试,效果很好
for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done
-rvf
选项添加到cp
,以及(3)您未引用变量展开。(还请注意,通常在标点符号like ;
和下一个单词之间留一个空格。)-p
选项的添加很有价值,但是(4a)已经在注释中得到解决,而(4b)您的答案不是如果您不解释自己在做什么,将会很有帮助。
echo
哪个不应该在哪里,$1
哪个应该在$i
吗?