Puede hacer esto usando la -T
opción en cp
.
Consulte la página Man para cp
.
-T, --no-target-directory
treat DEST as a normal file
Entonces, según su ejemplo, la siguiente es la estructura del archivo.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Puede ver la clara diferencia cuando lo usa -v
para Verbose.
Cuando usa solo -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
Cuando usa la opción -T
, sobrescribe el contenido, tratando el destino como un archivo normal y no como un directorio .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Esto debería solucionar tu problema.
bar/
) pero no en la fuente (foo/
) se dejarán en su lugar, por lo que esto no es lo que la mayoría de la gente consideraría una sobrescritura completa del directorio. es decir. sibar/baz
ya existiera, seguiría existiendo después ...rm -rf bar/* && cp -TRv foo/ bar/
Hágalo en dos pasos.
fuente
bar
contenido sea idénticofoo
, no una combinación de elementos defoo
más otros elementos que ya existíanbar
. La respuesta altamente votada de @Saurabh Meshram a continuación tiene este problema.rm -rf bar/; cp -r foo/ !$
foo
ybar
son directorios grandes ... tal vez hay archivosbar
que no están yfoo
que no quieres eliminar. Esto no debería considerarse una respuesta realista en mi humilde opiniónSi desea asegurarse de que
bar/
termine siendo idéntico afoo/
, usersync
en su lugar:Si solo han cambiado algunas cosas, esto se ejecutará mucho más rápido que eliminar y volver a copiar todo el directorio.
-a
es 'modo de archivo', que copia los archivos fielmente enfoo/
abar/
--delete
elimina archivos adicionales no enfoo/
partirbar/
, así, asegurarbar/
termina idénticos-vh
para verboso y legible para humanosfoo
se requiere la barra inclinada posterior ; de lo contrario,rsync
se copiaráfoo/
enbar/foo/
lugar de sobrescribirbar/
.foo/
sobre el contenido debar/
, use una barra en ambos. Es confuso porque no funcionará como se espera con una barra en ninguno , sin embargo; rsync siempre interpreta furtivamente la ruta de destino como si tuviera una barra, a pesar de que respeta la ausencia de una barra en el origen ruta. Por lo tanto, necesitamos una barra en la ruta de origen para que coincida con la barra que se agrega automáticamente en la ruta de destino, si queremos copiar el contenido defoo/
enbar/
, en lugar del directoriofoo/
aterrizando enbar/
comobar/foo
.)rsync
es muy poderoso y útil, si tiene curiosidad, busque qué más puede hacer (como copiar sobre ssh).fuente
cp -T
opción porque también funciona en macosx 👍Utilice este
cp
comando:fuente
cp
comando eliminar el archivo de la fuente?El siguiente comando asegura que los archivos dotfiles (archivos ocultos) estén incluidos en la copia:
fuente
.
significa todos los archivos en el directorio. Entonces, naturalmente, se incluirían los archivos ocultos.Muy similar a @Jonathan Wheeler:
Si no quiere recordar, pero no reescribir
bar
:!$
muestra el último argumento de su comando anterior.fuente
Esto debería solucionar tu problema.
fuente
La operación que definió es una "combinación" y no puede hacer eso con
cp
. Sin embargo, si no está buscando fusionar y está bien perder la carpetabar
, simplemente puederm -rf bar
eliminar la carpeta y luegomv foo bar
cambiarle el nombre. Esto no llevará ningún tiempo, ya que ambas operaciones se realizan mediante punteros de archivo, no con el contenido del archivo.fuente
Intente utilizar este comando compuesto por dos pasos:
fuente