web-dev-qa-db-fra.com

Comment copier un fichier dans plusieurs dossiers à l'aide de la ligne de commande?

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?

61
nux

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
67
Radu Rădeanu

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 0option:

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 {} \;
58
Sylvain Pineau

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.

31
Rmano

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.

23
Evandro Silva

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.

7
nux

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 {} \;
1
matt

Nous venons de penser à donner une variation à la réponse de Sylvain Pineau

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.

0
Joshi