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
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityYour shell code has two issues:
echo
should not be there.$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.
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
cp
(depends on the file size relative to available memory), but has the defect of not preserving any file metadata.
Jun 21, 2016 at 9:44
cp -p
to preserve metadata either.
Jun 6, 2017 at 20:03
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
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
-rvf
options to cp
, and (3) you have failed to quote your variable expansion. (Also note that it’s conventional to have a space between punctuation symbols like ;
and the following word.) The addition of the -p
option is valuable, but (4a) it’s been addressed already (in comments), and (4b) your answer isn’t helpful if you don’t explain what you’re doing.
Jan 17, 2018 at 20:03
echo
which should not be there, and the$1
which should be$i
?test$1.ogg
then it says: test.ogg and test.ogg are the same files, so it seems like $1 is not recognized?$1
instead of$i
, it is earlie in the morning, sorry... thank you. I will use$x
in the future instead of$i