Duplicate file x times in command shell

I try to duplicate a video file x times from the command line by using a for loop, I’ve tried it like this, but it does not work:

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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Your shell code has two issues:

  1. The echo should not be there.
  2. The variable $i (“dollar i”) is mistyped as $1 (“dollar one”) in the destination file name.

To make a copy of a file in the same directory as the file itself, use

cp thefile thecopy

If you use more than two arguments, e.g.

cp thefile theotherthing thecopy

then it is assumed that you’d like to copy thefile and theotherthing into the directory called thecopy.

In your case with cp test.ogg echo "test$1.ogg", it specifically looks for a file called test.ogg and one named echo to copy to the directory test$1.ogg.

The $1 will most likely expand to an empty string. This is why, when you delete the echo from the command, you get “test.ogg and test.ogg are the same files”; the command being executed is essentially

cp test.ogg test.ogg

This is probably a mistyping.

In the end, you want something like this:

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

Or, as an alternative

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

Or, using tee:

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

Note: This would most likely work for 100 copies, but for thousands of copies it may generate a “argument list too long” error. In that case, revert to using a loop.

Method 2

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

Method 3

Short and precise

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

or even better do

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

see tee command usage for more help.

Update

as suggested by @Gilles, using tee has the defect of not preserving any file metadata. To overcome that issue, you might have to run below command after that:

cp --attributes-only --preserve Source Target

Method 4

You have not called variable i while copying

use below script . As tested it worked fine

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

Method 5

The folowing command will copy file.a 5 times:

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

If you prefer dd (not the same as cp!):

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x