Vous pouvez le faire en utilisant l' -T
option dans cp
.
Voir la page Man pour cp
.
-T, --no-target-directory
treat DEST as a normal file
Donc, selon votre exemple, voici la structure des fichiers.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Vous pouvez voir la différence claire lorsque vous utilisez -v
pour Verbose.
Lorsque vous utilisez uniquement l' -R
option.
$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
$ tree
|-- bar
| |-- a
| |-- b
| `-- foo
| |-- a
| `-- b
`-- foo
|-- a
`-- b
3 directories, 6 files
Lorsque vous utilisez l'option, -T
il écrase le contenu, traitant la destination comme un fichier normal et non comme un répertoire .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Cela devrait résoudre votre problème.
Saurabh Meshram
la source
bar/
) mais pas dans la source (foo/
) seront laissés en place, ce n'est donc pas ce que la plupart des gens considèrent comme un écrasement complet du répertoire. c'est à dire. s'ilbar/baz
existait déjà, il existerait toujours par la suite ...rm -rf bar/* && cp -TRv foo/ bar/
Faites-le en deux étapes.
la source
bar
contenu est identique àfoo
, et non une combinaison d'éléments defoo
plus d'autres éléments qui ont peut-être déjà existé dansbar
. La réponse hautement votée de @Saurabh Meshram ci-dessous a ce problème.rm -rf bar/; cp -r foo/ !$
foo
etbar
sont de grands répertoires ... peut-être qu'il y a des fichiersbar
qui ne sont pas dansfoo
que vous ne voulez pas supprimer. Cela ne devrait pas être considéré comme une réponse réaliste à mon humble avisSi vous voulez vous assurer que les
bar/
finitions sont identiques àfoo/
, utilisezrsync
plutôt:Si quelques petites choses ont changé, cela s'exécutera beaucoup plus rapidement que de supprimer et de recopier tout le répertoire.
-a
est « mode archives », qui copie les fichiers fidèlementfoo/
auxbar/
--delete
supprime les fichiers supplémentaires nonfoo/
debar/
plus, veiller àbar/
finit identiques-vh
pour verbeux et lisible par l'hommefoo
est obligatoire, sinonrsync
copierafoo/
versbar/foo/
plutôt que l'écrasementbar/
lui - même.foo/
sur le contenu debar/
, nous utilisez une barre oblique sur les deux. C'est déroutant car cela ne fonctionnera pas comme prévu avec une barre oblique sur ni l' un ni l'autre , cependant; rsync interprète toujours sournoisement le chemin de destination comme s'il avait une barre oblique, même s'il honore l'absence de barre oblique sur la source Nous avons donc besoin d'une barre oblique sur le chemin source pour qu'il corresponde à la barre oblique ajoutée automatiquement sur le chemin de destination, si nous voulons copier le contenu defoo/
intobar/
, plutôt que le répertoirefoo/
lui-même atterrissant dansbar/
asbar/foo
.)rsync
est très puissant et utile, si vous êtes curieux de voir ce qu'il peut faire d'autre (comme copier sur ssh).la source
cp -T
option car elle fonctionne également sur macosx 👍Utilisez cette
cp
commande:la source
cp
commande devrait- elle supprimer le fichier de la source?La commande suivante garantit que les dotfiles (fichiers cachés) sont inclus dans la copie:
la source
.
signifie tous les fichiers du répertoire. Donc, naturellement, les fichiers cachés seraient inclus.Très similaire à @Jonathan Wheeler:
Si vous ne voulez pas vous souvenir, mais pas réécrire
bar
:!$
affiche le dernier argument de votre commande précédente.la source
Cela devrait résoudre votre problème.
la source
L'opération que vous avez définie est une "fusion" et vous ne pouvez pas le faire avec
cp
. Cependant, si vous ne cherchez pas à fusionner et que vous êtes d'accord pour perdre le dossier,bar
vous pouvez simplementrm -rf bar
supprimer le dossier, puismv foo bar
le renommer. Cela ne prendra pas de temps car les deux opérations sont effectuées par des pointeurs de fichier et non par le contenu du fichier.la source
Essayez d'utiliser cette commande composée de deux étapes:
la source