Tengo un montón de archivos y directorios en un subdirectorio que quiero mover al directorio principal. Ya hay algunos archivos y directorios en el directorio de destino que deben sobrescribirse. Los archivos que solo están presentes en el destino deben dejarse intactos. ¿Puedo obligarme mv
a hacer eso? ( mv * ..
) Se queja
mv: cannot move `xyz' to `../xyz': Directory not empty
¿Qué me estoy perdiendo?
shell
command-line
rename
EricSchaefer
fuente
fuente
mv -f
?mv -f
no es la respuesta correcta.Respuestas:
Deberá copiarlos en el destino y luego eliminar la fuente, utilizando los comandos
cp -r * ..
seguidos derm -rf *
.No creo que pueda "fusionar" directorios usando
mv
.fuente
mv
es más rápido porque estás en el mismo sistema de archivos? ¿Quécp -l
sucede si usas para crear enlaces duros en lugar de mover realmente los archivos?cp -a
lugar decp -r
para preservar los atributos del archivo (marca de tiempo, permisos, etc.).cp -rl source destination && rm -r source
.rsync
probablemente sería una mejor opción aquí. Es tan simple comorsync -a subdir/ ./
.Mi árbol de prueba en
filename
:contents
formato:Corriendo
rsync
:Da:
Y luego, para emular
mv
, probablemente desee eliminar el directorio fuente:Dando:
Si esto está mal, ¿puede proporcionar un ejemplo similar (por ejemplo, usando mi árbol de prueba cerca de la parte superior de esta respuesta) con el resultado deseado?
fuente
rm -r
al final para que sea básicamente lo mismo quemv
.mv
es atómico, conserva los números de inodo (para que el archivo pueda permanecer abierto) y no requiere tiempo ni espacio para hacer una copia.cp -r; rm -r
. Creo que en ese sentido,rsync
vale la pena mencionar también.rsync
puede eliminar la fuente después de las copias con el--remove-source-files
parámetro Esta debería ser una manera conveniente de hacer lo que le gustaría.De la
rsync man page
:fuente
cp -r; rm
por falta de espacio libre. En cambiorsync --remove-source-files
, el espacio en disco usado minimizado evitó copiar sobre los mismos archivos exactos.Puede hacer esto con
cp
yrm
, pero sin copiar la gran cantidad de datos que intenta (presumiblemente) está tratando de evitar la transferencia. @mattdm aludió a esto en su comentario , y una respuesta para otra pregunta tiene una discusión más completa sobre varias opciones.Esencialmente, la
-l
opción para elcp
comando crea enlaces duros a los archivos en lugar de copiar sus datos a archivos nuevos.fuente
cp -al source destination
para preservar la información y los permisos del propietario.cp
sobrescribe de forma predeterminada. La-f
opción intenta eliminar el archivo (como enrm
) antes de intentar copiar de nuevo, lo que puede ayudar si el proceso no puede abrir el archivo para escribir, aunque algunas personas prefieren ver que hubo un error. No sé si le importó al OP, pero de-f
todos modos agregué la bandera a mi respuesta.Aquí hay un script que mueve los archivos de debajo
/path/to/source/root
a la ruta correspondiente debajo/path/to/destination/root
.Cuidado, código no probado.
fuente
\;
antes-o
de la primera línea delfind
comando, y no debe escapar!
en elif
- es!
, no\!
Este hilo está disponible desde hace años y todavía ocupa el puesto número 1 en Google, así que quería agregar otro método. Cómo suelo hacer esto: empaquetar el contenido del subdirectorio en un tarball, mover el tarball al directorio principal y luego extraerlo con el comportamiento predeterminado de sobrescritura. Esto hace exactamente lo que estás buscando. Luego puedes eliminar tu subdirectorio.
fuente
Si tiene suficiente almacenamiento, puede hacerlo de la siguiente manera:
Asegúrese de que no haya ningún archivo importante con un ~ al final, pero si lo hay, puede agregarlo en
--suffix=whateveryouwant
lugar del predeterminado.fuente