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
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:
Le echone devrait pas être là.
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:
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.
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:
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
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.
echo
qui ne devrait pas être là et celle$1
qui devrait l'être$i
?test$1.ogg
il est dit: test.ogg et test.ogg sont les mêmes fichiers , il semble donc que $ 1 ne soit pas reconnu?$1
au lieu de$i
, c'est tôt le matin, désolé ... merci. J'utiliserai$x
à l'avenir au lieu de$i
Réponses:
Votre code shell a deux problèmes:
echo
ne devrait pas être là.$i
est mal typée 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
Si vous insérez autre chose dedans, par exemple
alors on suppose que vous souhaitez copier
thefile
ettheotherthing
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épertoiretest$1.ogg
.Le
$1
sera probablement développé en une chaîne vide. C'est pourquoi, lorsque vous supprimez leecho
de la commande, vous obtenez "test.ogg et test.ogg sont les mêmes fichiers"; la commande en cours d'exécution est essentiellementC'est probablement une faute de frappe.
En fin de compte, vous voulez quelque chose comme ça:
Ou, comme alternative
Ou en utilisant
tee
: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.
la source
Court et précis
ou mieux encore
voir l' utilisation de la commande tee pour plus d'aide.
Mise à jour
comme suggéré par @Gilles, l'utilisation
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:la source
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.cp --attributes-only
après.cp -p
pour conserver les métadonnées non plus.la source
La commande suivante copiera file.a 5 fois:
Si vous préférez dd (différent de cp!):
la source
Vous n'avez pas appelé la variable i lors de la copie
utilisez le script ci-dessous. Comme testé, cela a bien fonctionné
la source
-rvf
options à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'-p
option 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.