linux - todos - ¿Cómo forzar a ''cp'' a sobrescribir el directorio en lugar de crear otro dentro?
renombrar archivo linux (5)
El siguiente comando garantiza que los archivos punto (archivos ocultos) estén incluidos en la copia:
$ cp -Rf foo/. bar
Intento escribir un script Bash que sobrescribirá un directorio existente. Entonces, tengo un directorio foo / y estoy intentando sobrescribir la barra / con ella. Pero cuando lo hago,
cp -Rf foo/ bar/
lo que ocurre es que se crea un nuevo directorio bar / foo /. No quiero eso. Hay dos archivos en foo / a y b. Hay archivos con los mismos nombres en la barra / también. Quiero que el foo / a y foo / b reemplacen bar / a y bar / b.
Hazlo en dos pasos.
rm -r bar/
cp -r foo/ bar/
Muy similar a @Jonathan Wheeler:
Si no quiere recordar, pero no reescribir la bar
:
rm -r bar/
cp -r foo/ !$
!$
muestra el último argumento de su comando anterior.
Puedes hacer esto usando la opción -T
en cp
.
Ver página Man para cp
.
-T, --no-target-directory
treat DEST as a normal file
Entonces, según su ejemplo, a continuación se muestra la estructura del archivo.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Puedes ver la clara diferencia cuando usas -v
para Verbose.
Cuando usas solo la opción -R
.
$ 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 los contenidos, 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.
Use este comando cp
:
cp -Rf foo/* bar/