Comment faire pour que cp -r
copie absolument tout des fichiers et des répertoires d'un répertoire
Exigences:
Mon hack, mais qui travaille, c'est:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
Comment puis-je faire tout cela en une seule commande sans correspondance de modèle? Quel drapeau dois-je utiliser?
Ne spécifiez pas les fichiers:
cp -r /etc/skel /home/user
(Notez que /home/user
ne doit pas déjà exister, sinon il va créer /home/user/skel
.)
Disons que vous avez créé le nouveau dossier (ou allez en créer un) et que vous souhaitez y copier les fichiers une fois le dossier créé.
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>
Cela copiera tous les fichiers/dossiers de manière récursive à partir de /etc/skel
dans le dossier existant déjà créé sur la première ligne.
bash
a lui-même une bonne solution, elle a un Shell option
, vous pouvez cp
, mv
et ainsi de suite:
shopt -s dotglob # for considering dot files (turn on dot files)
et
shopt -u dotglob # for don't considering dot files (turn off dot files)
La solution ci-dessus correspond à la norme bash
REMARQUE:
shopt # without argument show status of all Shell options
-u # abbrivation of unset
-s # abbrivation of set
Pour ce faire, utilisez l’option -T (--no-target-directory)
et copiez récursivement les dossiers (sans les barres obliques, astérisques, etc.), c’est-à-dire
cp -rT /etc/skel /home/user
Cela copiera le contenu de /etc/skel
dans /home/user
(y compris les fichiers cachés), en créant le dossier /home/user
s'il n'existe pas; Toutefois, l'option -T
empêche le contenu de /etc/skel
d'être copié dans un nouveau dossier /home/user/skel
si le dossier /home/user
existait.
Utilisez rsync:
rsync -rtv source_folder/ destination_folder/
Si votre répertoire source et votre répertoire cible ont le même nom, même si le répertoire cible existe, vous pouvez simplement taper:
cp -R /etc/skel /home/
Cela copiera le répertoire/etc/skel dans/home /, y compris les fichiers et répertoires cachés.
Vous pouvez éventuellement copier le répertoire et le renommer en une seule ligne:
cp -R /etc/skel /home/ && mv /home/skel /home/user
rsync
c'est bien, mais un autre choix:
cp -a src/ dst/
De l'aide principale:
-a, --archive
same as -dR --preserve=all
-d same as --no-dereference --preserve=links
-R, -r, --recursive
copy directories recursively
Vous pouvez utiliser rsync.
rsync -aP ./from/dir/ /some/other/directory/
Vous pouvez même copier sur ssh
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/
Vous pouvez utiliser différents indicateurs: -a, --archive # archive (-rlptgoD)
-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials
--delete # Delete extra files
You may want to add the -P option to your command.
--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.
-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.
cp -r /etc/skel/{.,}* /home/user
L'expression {.,}*
inclut tous les fichiers et répertoires (commençant également par un point).
Si vous ne souhaitez pas utiliser l'expression ci-dessus, vous pouvez utiliser la propriété cp
, qui permet de spécifier plusieurs sources pour un dossier cible:
cp -r /etc/skel/* /etc/skel/.* /home/user
Notez qu’il existe une astuce en ligne de commande (fonctionne au moins dans sh , bash et ksh ): il suffit de suffixer le répertoire de avec une barre oblique. Cela versera le contenu du répertoire from dans le répertoire vers (ironiquement, j'avais d'abord appris cette astuce lorsque using rsync ).
Exemple:
/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2
/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa
/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa
Je suis venu ici avec Google pour trouver une solution au même problème, puis j’ai réalisé que c’était facile à trouver. L'avantage est qu'il ne dépend pas du shell ou des utilitaires spéciaux qui peuvent ne pas être installés.
find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;
J'ai essayé le truc avec slash de fuite, mais cela n'a pas fonctionné pour moi.
Ma solution à ce problème lorsque je dois copier tous les fichiers (y compris les fichiers .
) dans un répertoire cible en conservant les autorisations est: (écrasez-la si elle existe déjà)
yes | cp -rvp /source/directory /destination/directory/
yes
sert à écraser automatiquement les fichiers de destination. r
récursif, v
verbeux, p
conserver les autorisations.
Notez que le chemin source ne se termine pas par un /
(donc tous les fichiers/répertoire et .fichiers sont copiés)
Le répertoire de destination se termine par /
car nous plaçons le contenu du dossier source dans le répertoire de destination.
J'ai vu que cp ne copie pas toujours les fichiers cachés et si vous souhaitez une commande qui semble fonctionner avec tous les dialectes linux/unix, vous devriez essayer d'utiliser:
cd /etc/skel
find | cpio -pdumv /home/user