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

22

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
Noir
la source
5
Votre seule erreur n'est-elle pas celle echoqui ne devrait pas être là et celle $1qui devrait l'être $i?
Julie Pelletier
si je supprime l'écho et l'utilise uniquement, test$1.oggil est dit: test.ogg et test.ogg sont les mêmes fichiers , il semble donc que $ 1 ne soit pas reconnu?
Black
@EdwardBlack: On dirait que j'ai mal compris vos exigences. Cette solution ne convient pas.
cuonglm
@JuliePelletier, putain, il m'arrive parfois que j'écris accidentellement $1au lieu de $i, c'est tôt le matin, désolé ... merci. J'utiliserai $xà l'avenir au lieu de$i
Black

Réponses:

25

Votre code shell a deux problèmes:

  1. Le echone devrait pas être là.
  2. La variable $iest mal typée comme $1dans 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 insérez autre chose dedans, par exemple

cp thefile theotherthing thecopy

alors on suppose que vous souhaitez copier thefileet theotherthingdans le répertoire appelé thecopy.

Dans votre cas, il recherche spécifiquement un fichier appelé test.ogget un nommé echoà copier dans le répertoire test$1.ogg.

Le $1sera probablement développé en une chaîne vide. C'est pourquoi, lorsque vous supprimez le echode 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.

Kusalananda
la source
12

Court et précis

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

ou mieux encore

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

voir l' utilisation de la commande tee pour plus d'aide.

Mise à jour

comme suggéré par @Gilles, l'utilisation teea 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
Rahul
la source
3
Ceci est potentiellement plus rapide que plusieurs appels à cp(dépend de la taille du fichier par rapport à la mémoire disponible), mais a le défaut de ne conserver aucune métadonnée de fichier.
Gilles 'SO- arrête d'être méchant'
@ Gilles ohh, pouvons-nous surmonter cela?
Rahul
3
Vous pouvez courir cp --attributes-onlyaprès.
Gilles 'SO- arrête d'être méchant'
@Gilles merci, mis à jour ma réponse selon votre aide.
Rahul
FWIW aucune des autres réponses utilisées cp -ppour conserver les métadonnées non plus.
roaima
11
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
coffeMug
la source
1
Les extensions variables doivent être indiquées.
cat
1

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
cy8g3n
la source
0

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
Praveen Kumar BS
la source
3
C'est la même chose que deux réponses précédentes et un commentaire sauf (1) la question demande environ 100, et votre réponse utilise 10, (2) vous avez inutilement ajouté les -rvfoptions à cp, et (3) vous n'avez pas cité votre expansion de variable . (Notez également qu'il est conventionnel d'avoir un espace entre les symboles de ponctuation comme ;et le mot suivant.) L'ajout de l' -poption est utile, mais (4a) elle a déjà été traitée (dans les commentaires), et (4b) votre réponse n'est pas utile si vous n'expliquez pas ce que vous faites.
Scott