J'essaie de dupliquer un fichier vidéo x fois à partir de la ligne de commande en utilisant une boucle for, je l'ai essayé comme ça, mais cela ne fonctionne pas:
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
Votre code Shell présente deux problèmes:
echo
ne devrait pas être là.$i
est mal orthographié comme $1
dans le nom du fichier de destination.Pour faire une copie d'un fichier dans le même répertoire que le fichier lui-même, utilisez
cp thefile thecopy
Si vous y insérez autre chose, par exemple.
cp thefile theotherthing thecopy
alors on suppose que vous souhaitez copier thefile
et theotherthing
dans le répertoire appelé thecopy
.
Dans votre cas, il recherche spécifiquement un fichier appelé test.ogg
et un nommé echo
à copier dans le répertoire test$1.ogg
.
Le $1
se développera très probablement en une chaîne vide. C'est pourquoi, lorsque vous supprimez le echo
de la commande, vous obtenez "test.ogg et test.ogg sont les mêmes fichiers"; la commande en cours d'exécution est essentiellement
cp test.ogg test.ogg
C'est probablement une faute de frappe.
En fin de compte, vous voulez quelque chose comme ça:
for i in {1..100}; do cp test.ogg "test$i.ogg"; done
Ou, comme alternative
i=0
while (( i++ < 100 )); do
cp test.ogg "test$i.ogg"
done
Ou, en utilisant tee
:
tee test{1..100}.ogg <test.ogg >/dev/null
Remarque: Cela fonctionnerait très probablement pour 100 copies, mais pour des milliers de copies, cela pourrait générer une erreur "liste d'arguments trop longue". Dans ce cas, revenez à l'utilisation d'une boucle.
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
Court et précis
< test.ogg tee test{1..100}.ogg
ou mieux encore
tee test{1..100}.ogg < test.ogg >/dev/null
voir tilisation de la commande tee pour plus d'aide.
Mise à jour
comme suggéré par @Gilles, l'utilisation de tee
a le défaut de ne conserver aucune métadonnée de fichier. Pour surmonter ce problème, vous devrez peut-être exécuter la commande ci-dessous après cela:
cp --attributes-only --preserve Source Target
La commande suivante copiera file.a 5 fois:
$ seq 5 | xargs -I AA cp file.a fileAA.a
Si vous préférez dd (différent de cp!):
$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a
Vous n'avez pas appelé la variable i lors de la copie
utilisez le script ci-dessous. Comme testé, cela a bien fonctionné
for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done