J'ai essayé de copier un fichier test.txt
dans plusieurs répertoires avec une seule commande:
cp ~/test.txt ~/folder1 ~/folder2
Mais je n'ai pas réussi. Existe-t-il un moyen de le faire en une seule commande pour pouvoir copier un fichier ou même un dossier dans plusieurs répertoires?
cp
peut copier à partir de plusieurs sources, mais ne peut pas copier sur plusieurs destinations. Voir man cp
pour plus d'informations.
La seule commande bash que je connaisse qui puisse copier/enregistrer dans plusieurs destinations est tee
.
Vous pouvez l'utiliser dans votre cas comme suit:
tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt
Notez que tee
écrit également l'entrée dans la sortie standard (stdout). Donc, si vous ne le souhaitez pas, vous pouvez l’empêcher en redirigeant la sortie standard vers /dev/null
comme suit:
tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
Une autre façon de réaliser une copie vers plusieurs emplacements est la commande suivante:
find dir1 dir2 -exec cp file.txt {} \;
Si dir1 ou dir2 ont des sous-répertoires dans lesquels vous ne voulez pas copier le fichier, ajoutez -maxdepth 0
option:
find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;
Notez que cela écrasera tous les fichiers de dir1
et dir2
avec le contenu de file.txt
, en plus de les copier. Pour ne copier que file.txt
sans affecter les autres fichiers de ces répertoires, indiquez à find
de n'agir que sur les répertoires:
find dir1 dir2 -type d -exec cp file.txt {} \;
La commande
cp ~/test.txt ~/folder1 ~/folder2
essaie de copier deux fichiers (~/test.txt
et ~/folder1
) dans la destination folder2
. (Et si ~/folder2
existe et est un répertoire vous aurez un avertissement "omitting directory").
Si vous voulez faire plusieurs copies du fichier test.txt
, vous devez utiliser une boucle ou plusieurs commandes ...
for i in ~/folder1 ~/folder2; do cp ~/test.txt $i; done
(... et faites attention si vous avez des espaces incorporés dans les noms de fichiers, vous aurez besoin de guillemets).
Pour copier des répertoires entiers, vous devez utiliser l'option -r
:
for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done
cela va créer ~/folder1/folder3
et ~/folder2/folder3
avec tous les fichiers inclus.
Vous pouvez créer un script d'aide ou le faire avec xargs
et une fonction d'impression (dans ce cas, echo
):
echo firstDir secondDir | xargs -n 1 cp test
Cela fera de chaque répertoire un argument de la fonction cp
, en utilisant le fichier test comme paramètre.
Après une longue recherche ce travail aussi comme un charme!
for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done
Cela va copier fichier.txt dans tous les répertoires de votre emplacement actuel dans le terminal.
for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done
Cela copiera un dossier dans chaque sous-répertoire de votre emplacement actuel dans le terminal.
Je le partage j'espère que cela aidera les autres aussi.
Si vous voulez copier le fichier test.txt dans chaque répertoire de/tmp/target/...
créer un environnement de test:
mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt
copier le:
find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
Nous venons de penser à donner une variation à la réponse de Sylvain Pineau
où dir1
et dir2
ne sont pas dans votre répertoire actuel.
find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;
here find cherchera dir1
deux niveaux de profondeur ou vous pouvez laisser le paramètre -maxdepth
pour trouver dir1
dans tous les dossiers du répertoire en cours et au-dessous.