Tant que vous ne cherchez que des fichiers et dossiers cachés au niveau A et que vous ne voulez pas, par exemple
A/b/.hidden
pour être copié, vous devriez pouvoir utiliser ceci :
cp -r A/.[^.]* B
Cela signifie essentiellement copier tout ce qui commence par un .
puis tout caractère autre qu'un .
Cela filtre .
et ..
Edit :Suppression du -p de la commande cp car Asker n'a pas indiqué qu'il souhaitait conserver les propriétés, les dates, etc.
Le problème avec A/.*
c'est qu'il y a le répertoire .
en A
qui correspond également au motif.
Vous pouvez activer les modèles glob étendus et utiliser les éléments suivants :
shopt -s extglob
cp -r A/.!(?(.)) B
Il correspond aux fichiers dont le nom commence par un point et dont le deuxième caractère n'est ni un point ni rien ( ?(.) correspond à rien ou à un point, !(...) l'annule, c'est-à-dire !(?(.)) correspond à tout le reste que rien ou un point).
Pour des cas comme celui-ci, nous vous recommandons d'utiliser find
au lieu de cp
comme ceci :
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
La syntaxe de base se décompose comme suit :
find A/ -type f
:find
éléments du répertoireA/
dont le type est un fichier (au lieu d'un répertoire)…-maxdepth 1 -name '.*'
:A ceci pour unmaxdepth
de 1 répertoires et dontname
commence par.
.-exec cp -p {} B/ \;
:Et une fois ces fichiers trouvés,exec
lecp
commande avec un-p
drapeau pour conserver les dates/heures de la source ({}
) à la destination deB/
.
J'aime utiliser maxdepth
pour ajouter une couche de contrôle afin de ne pas copier accidentellement un système de fichiers entier. Mais n'hésitez pas à le supprimer.