web-dev-qa-db-fra.com

Comment copier tous les fichiers d'un répertoire à un autre dans un script bash

Je veux copier tous les fichiers d'un sous-répertoire dans un autre répertoire sans copier le dossier d'origine. Dans un terminal, je ferais juste ceci:

cp -r dir1/* dir2

puis dir2 contiendra tous les fichiers de dir1 sans contenir dir1 lui-même. J'essaie de répliquer cela dans un script bash et j'obtiens une erreur. Voici mon code bash:

cp -r $pck_dir"/*" $TAR_DIR"/pck/"

Je reçois cette erreur:

cp: cannot stat ‘./mailman/lists/mailman/*’: No such file or directory

C'est étrange car je peux vérifier que le répertoire en question existe. Je crois que bash se plaint du "*" mais je ne sais pas pourquoi. Quelqu'un peut-il m'éclairer sur ce que je fais mal?

12
user3361761

Développant le commentaire de devnull:

  • Citations de tout type autour d'un caractère générique, comme *, empêchera le Shell d'étendre le caractère générique. Ainsi, vous ne devez écrire que "/*" si vous voulez une barre oblique suivie d'une étoile littérale.

  • Une variable sans guillemets sera sujette au fractionnement de Word. Donc, si pck_dir avait la valeur my dir, puis $pck_dir"/*" serait étendu à deux mots my et dir/* et les deux mots seraient passés à cp comme arguments séparés. Sauf si vous souhaitez fractionner Word, les variables Shell doivent toujours être entre guillemets.

Ainsi, pour obtenir ce que vous voulez, utilisez:

cp -r "$pck_dir"/* "$TAR_DIR/pck/"
15
John1024

Utilisez plutôt la ligne de commande rsync.

rsync -auv dir1/dir2 /

synchronisera récursivement tous les fichiers du dossier dir1 dans le dossier dir2.

homme rsync

pour obtenir plus d'explications pour savoir comment utiliser cette ligne de commande.

2
jmo