在命令外壳中重复文件x次


22

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

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

5
您不是唯一的错误,echo哪个不应该在哪里,$1哪个应该在$i吗?
Julie Pelletier

如果我删除回声并仅使用test$1.ogg它,则它说:test.ogg和test.ogg是相同的文件,因此似乎无法识别$ 1?
黑色:

@EdwardBlack:听起来我误会了您的要求。该解决方案不适合。
cuonglm

@JuliePelletier,该死,有时候我不小心写了$1而不是我写的$i,这是早上的早泄,对不起...谢谢。我将$x在将来使用,而不是$i
黑色

Answers:


25

您的外壳程序代码有两个问题:

  1. echo不应该存在。
  2. 该变量的$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个副本,但是对于数千个副本,则可能会生成“参数列表过长”错误。在这种情况下,请还原为使用循环。


12

简短而精确

< 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

3
这可能比多次调用要快cp(取决于相对于可用内存的文件大小),但是存在不保留任何文件元数据的缺陷。
吉尔斯(Gilles)'所以

@吉尔斯哦,我们能克服吗?
Rahul

3
您可以cp --attributes-only随后运行。
吉尔(Gilles)'所以

@吉尔斯谢谢,根据您的帮助更新了我的答案。
拉胡尔

FWIW没有其他答案可以用来cp -p保存元数据。
roaima

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

1
变量扩展应加引号。

1

下列命令将复制file.a 5次:

$ seq 5 | xargs -I AA cp file.a fileAA.a

如果您更喜欢dd(与cp不同!):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a

0

您在复制时尚未调用变量i

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

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

3
这与之前的两个答案和一个注释相同,除了(1)问题要求大约100,并且答案使用10,(2)您不必要地将-rvf选项添加到cp,以及(3)您未引用变量展开。(还请注意,通常在标点符号like ;和下一个单词之间留一个空格。)-p选项的添加很有价值,但是(4a)已经在注释中得到解决,而(4b)您的答案不是如果您不解释自己在做什么,将会很有帮助。
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.