Est-il possible de copier un seul fichier dans plusieurs répertoires à l'aide de la commande cp?
J'ai essayé ce qui suit, qui n'a pas fonctionné:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Je sais qu'il est possible d'utiliser une boucle for ou de trouver. Mais est-il possible d'utiliser la commande gnu cp?
Vous ne pouvez pas le faire
cp
seul, mais vous pouvez combinercp
avecxargs
:Copiera
file1
àdir1
,dir2
etdir3
.xargs
appelleracp
3 fois pour ce faire, consultez la page de manuel pour plusxargs
de détails.la source
cp
seul". Le simple fait que la réponse ait tenté d'être utile en suggérant une autre façon ne signifie pas que la question n'a pas été répondue.echo dir[1-3] | xargs -n 1 cp filename
).Les caractères génériques fonctionnent également avec le code Roberts
la source
Pour autant que je puisse le voir, vous pouvez utiliser ce qui suit:
L'
-i
option decp
commande signifie qu'il vous sera demandé si vous souhaitez remplacer un fichier dans le répertoire en cours par lefile.dat
. Bien que ce ne soit pas une solution complètement automatique, cela a fonctionné pour moi.la source
-i
garde, cela ne vous incitera-t-il pas à écraser chaque fichier? plutôt que de copier dans les répertoires?cp: overwrite
questions, mais je n'ai pas eu à répondre à aucune d'entre elles, et il n'a pas écrasé les fichiers.J'utiliser
cat
ettee
sur la base des réponses que j'ai vu à /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets au lieu decp
.Par exemple:
la source
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
est également un modèle utile comme le montre la réponse de Taywee. Notez l'utilisation de io-redirection avec '<' afin que la tuyauterie de cat ne soit pas nécessaire.Ces réponses semblent toutes plus compliquées que l'évidence:
la source
for d in */ ; do cp $file "$i" done
ls -db di*/subdir | xargs -n 1 cp File
-b
dans le cas où il y a un espace dans le nom du répertoire sinon il sera cassé comme un élément différent par xargs, a eu ce problème avec la version echola source
Ne pas utiliser cp en soi, mais ...
Cela m'est venu dans le contexte de la copie de nombreuses séquences Gopro d'une carte SD (lente) vers trois lecteurs USB (lents). Je ne voulais lire les données qu'une seule fois, car cela prenait une éternité. Et je le voulais récursif.
(Et vous pouvez ajouter plus de ces sections> () si vous voulez plus de sorties.)
Je n'ai pas évalué cela, mais c'est certainement beaucoup plus rapide que cp-in-a-loop (ou un tas d'invocations cp parallèles).
la source
Pour utiliser la copie avec
xargs
des répertoires à l'aide de caractères génériques sur Mac OS, la seule solution qui a fonctionné pour moi avec des espaces dans le nom du répertoire est:Où se
test
trouve le fichier à copierEt
./fs*/*
les répertoires à copierLe problème est que xargs voit les espaces comme un nouvel argument, les solutions pour changer le caractère de délimitation en utilisant
-d
ou-E
ne fonctionnent malheureusement pas correctement sous Mac OS.la source
Si vous voulez le faire sans commande fourchue:
tee <inputfile file2 file3 file4 ... >/dev/null
la source
Essentiellement équivalent à la réponse xargs, mais au cas où vous souhaiteriez une exécution parallèle:
Ainsi, par exemple, pour copier file1 dans tous les sous-répertoires du dossier actuel (y compris la récursivité):
NB: Cela ne transmet probablement aucun gain de vitesse notable pour des cas d'utilisation très spécifiques, par exemple si chaque répertoire cible est un disque distinct.
Il est également fonctionnellement similaire à l'argument «-P» pour xargs.
la source
Non tu ne peux pas.
J'ai découvert à plusieurs reprises que je pouvais utiliser cette fonctionnalité, j'ai donc créé mon propre outil pour le faire pour moi.
http://github.com/ddavison/branch
assez simple -
branch myfile dir1 dir2 dir3
la source
/e
par exemple, juste une fois sur chaque machine, alors je pourrais écrire mes propres outils électriques et les garder pour toujours.la source
Supposons que vous souhaitiez copier
fileName.txt
dans tous les sous-répertoires du répertoire de travail actuel.Obtenez tous les noms de sous-répertoires
ls
et enregistrez-les dans un fichier temporaire, par exemple,allFolders.txt
Imprimez la liste et passez-la à la commande
xargs
.la source
Une autre façon consiste à utiliser chat et tee comme suit:
Je pense que ce serait assez inefficace, car le travail serait divisé en plusieurs processus (un par destination) et le disque dur écrirait plusieurs fichiers à la fois sur différentes parties du plateau. Cependant, si vous vouliez écrire un fichier sur plusieurs lecteurs différents, cette méthode serait probablement assez efficace (car toutes les copies pourraient se produire simultanément).
la source
Utilisation d'un script bash
la source
si vous souhaitez copier plusieurs dossiers dans plusieurs dossiers, vous pouvez faire quelque chose comme ceci:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}
la source
Si tous vos répertoires cibles correspondent à une expression de chemin d'accès - comme ils sont tous des sous-répertoires de
path/to
- alors utilisez simplementfind
en combinaison aveccp
comme ceci:C'est tout.
la source
find
dans le fil.Si vous devez être précis sur les dossiers dans lesquels copier le fichier, vous pouvez combiner la recherche avec un ou plusieurs greps. Par exemple, pour remplacer toute occurrence de favicon.ico dans n'importe quel sous-dossier, vous pouvez utiliser:
la source
Cela copiera dans les sous-répertoires immédiats, si vous voulez aller plus loin, ajustez le
-maxdepth
paramètre.Si vous ne souhaitez pas copier dans tous les répertoires, nous espérons que vous pourrez filtrer les répertoires qui ne vous intéressent pas. Exemple de copie dans tous les dossiers commençant par
a
Si vous copiez vers un ensemble de répertoires arbitraire / disjoint, vous aurez besoin de la suggestion de Robert Gamble.
la source
J'aime copier un fichier dans plusieurs répertoires en tant que tel:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
Et copier un répertoire dans d'autres répertoires:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Je sais que c'est comme émettre plusieurs commandes, mais cela fonctionne bien pour moi quand je veux taper 1 ligne et m'éloigner pendant un moment.
la source
Par exemple, si vous êtes dans le répertoire parent de vos dossiers de destination, vous pouvez faire:
pour i en $ (ls); faire le fichier source cp $ i; terminé
la source
ls
et toujours de citer des variables.for i in ./*; do cp sourcefile "$i"; done