mv: el directorio no está vacío

155

Quiero mover el contenido de un directorio dentro de otro directorio con las mismas carpetas.

Aquí hay un ejemplo:

Tengo ./backupque tienen los directorios basey test. Ahora quiero mover estos directorios ./backupArchives.

Yo uso esto:

mv ./backup/* ./backupArchives

pero recibí el error

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

Intenté usarlo --force, pero no tuve suerte. ¿Hay alguna forma de moverlo cuando las carpetas ya existen?

Nota: Solo quiero fusionar contenidos, no hay sobrescritura.

UdK
fuente
¿Está intentando fusionar el contenido de las carpetas en el destino o está intentando sobrescribir lo que está en el destino? (también ayuda si tiene el error COMPLETO, sin usar ...... para truncar datos)
Thomas Ward
Solo quiero fusionar el contenido, no hay sobrescritura.
UdK
2
@UdK Incluso si esto funcionara, tenga en cuenta que esto no fusionaría el contenido de los dos directorios. Mover un directorio reemplazará su objetivo. Eche un vistazo en su rsynclugar, hará la fusión.
zwets

Respuestas:

188

Aunque su página de manual no lo documenta, mvse negará a cambiar el nombre de un directorio a otro directorio si el directorio de destino contiene archivos. Esto es algo bueno en su caso porque resulta que desea fusionar el contenido de la fuente en el destino, lo mvque no funcionará.

Usar en su rsync -a backup/ backupArchives/lugar. Después de eso rm -rf backup/*.

En lugar de usar rsync, también puedes hacer el clásico

(cd backup && tar c .) | (cd backupArchives && tar xf -)

que te da más puntos geek.

zwets
fuente
44
cosas buenas para saber! Ambos están funcionando muy bien. ¡Gracias!
UdK
55
Los puntos geek son los mejores puntos: D
MadMike
2
Cabe señalar que esto requiere que tenga el tamaño de la carpeta en el espacio libre. Y causará problemas horribles si no.
Pogrindis
44
@Pogrindis ¿Explica qué problemas horribles ocurrirán y en qué se diferencian de cualquier otro intento de escribir en un disco completo? De hecho, dado que ambas operaciones mantienen intacto el directorio original, si la operación falla simplemente rm -rf backupArchivessin consecuencias, y mucho menos las 'horribles'.
zwets
44
Gracias por nombrar el enfoque clásico, ¡muy útil si rsync no está disponible! También funciona con sudo usandosudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
ArendE
39

Rápido y sucio, si sabes lo que estás haciendo:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
patrickvacek
fuente
3
También funciona en mi modo seguro, genio.
Banned_User
4

Después del directorio que mueve, necesita *(representa cualquier texto o número). Por ejemplo:

mv /var/www/* /recovery/wwwrecovery/

eso es todo, si mueve archivos, entonces se mueve como:

mv /var/www/index.php /recovery/index.php

Otra forma es empaquetar el contenido de esa carpeta usando tar:

tar -cvzpf backup.tar.gz /var/www 

Luego muévelo a cualquier otro archivo. También recomiendo este paso porque el alquitrán lo comprime y lo hace más pequeño.

Para extraer los archivos a otra carpeta, use

tar -xvzpf /var/www/

Si necesita copiar en una ubicación que no le pertenece, asegúrese de anteponer su comando con el sudocomando después de la opción que decida usar.

sudo tar -cvzpf backup.tar.gz /var/www/
Dimitris Theodoridis
fuente
Estoy usando Ubuntu 12.10 y obtuve: mv: opción no válida - 'R' Intente 'mv --help' para obtener más información. De hecho .tar es bueno, pero necesito saber cómo mover mis archivos para esta situación. Gracias por su ayuda
UdK
Estoy usando 12.04 escritorio y servidor y en ambos funciona bien. tenga cuidado, si no hizo espacio entre folfer y -R. También probé sin -R funciona de la misma manera para mí, intente sin -R, pero tenga cuidado con la ortografía: ¡¡¡linux importa letras mayúsculas y minúsculas !!! que si la ruta está en movimiento directo o desde la ubicación. si no tiene esa carpeta que desea mover, simplemente ponga -C después y la creará. También intente primero: encuentre el nombre -iname de su carpeta y ejecute este comando desde la raíz, solo para ver si existe en otro lugar si omite algo. dame el comando exacto que
usaste
qué thaaa ..... poner ese nombre de archivo entre **
Dimitris Theodoridis
1
Eso -Rseguramente no debería venir después del primer argumento. Las opciones (casi) siempre preceden a los argumentos del comando. Además, mvno tiene -Ropción, y finalmente, la recursividad es irrelevante para a mv. @DimitrisTheodoridis, por favor prueba tu respuesta primero.
zwets
sí mi hermano tienes razón, siempre tengo problemas con mi ortografía, y siempre tengo problemas con el terminal para eso o el comando no se encuentra o creo nuevos archivos y directorios que no sé, solo por la ortografía básica ... por cierto usó el comando cp, que aquí escribió mv sory para ese hermano: D
Dimitris Theodoridis
4

Claro rsyncque funciona, pero esto podría funcionar también para máquinas que no son compatibles rsync(es decir, en cpanel, que rsync no está instalado de manera predeterminada).

¿Qué pasa con el uso:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

Luego elimine el backupdirectorio si es necesario

Nota 1: debe ir cdal backupdirectorio antes de ejecutar elcp -R --parents ...

Nota 2: Verifique el backupArchivesdirectorio si obtuvo los archivos nuevos de la copia de seguridad.

Atillo Regner Rex
fuente
1

Antes de hacer la pregunta, consideremos un caso simplificado.

Supongamos que en / home / admin tenemos dos carpetas fooy barque tienen la misma estructura de subdirectorio, pero cada una contiene diferentes archivos. Ahora queremos fusionarlos en uno. Cuando hacemos cosas como mv foo/* bar, se mv: directory not emptyproduce el error .

Mi solución es renunciar a las herramientas de línea de comandos y cambiar a un administrador de archivos GUI, por ejemplo, dolphin. Cuando cambia el nombre foode baren dolphin, le da la opción de escribir en la carpeta de destino y le pregunta si desea sobrescribir los archivos existentes de forma interactiva. Esto evita copiar y eliminar, lo que en efecto ahorra tiempo sin una sola línea de código.

PD: no probé todos los administradores de archivos que hay. Pero la mayoría de ellos debería tener esta característica.

navigaid
fuente