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?
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/"
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.