web-dev-qa-db-fra.com

Fichier en double x fois dans l'interpréteur de commandes

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
24
Black

Votre code Shell présente deux problèmes:

  1. Le echo ne devrait pas être là.
  2. La variable $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.

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

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
12
Rahul

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
1
cy8g3n

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
0
Praveen Kumar BS