Usuario del software
2011-04-20 10:24:10 +0000 2011-04-20 10:24:10 +0000
79

Mover archivos y carpetas recursivamente en Linux

Considere:

ls -al ../public-back
drwxrwxr-x 4 apache apache 4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x 2 apache apache 4096 Apr 19 03:33 content
drwxrwxr-x 2 apache apache 20480 Apr 20 06:14 images
drwxrwxr-x 2 apache apache 4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x 4 apache apache 4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 content
drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 images
drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 video

¿Cómo muevo el contenido de /public-back/templates recursivamente con permisos a /public/templates?

Respuestas [5]

97
2011-04-20 14:10:36 +0000

A menos que esté malinterpretando la pregunta, esto funcionaría:

mv /public-back/templates/* /public/templates

También, a menos que tengas una lista enorme de archivos, añadir -i preguntará antes de que sobrescriba algo, lo que añade cierta seguridad al usar comodines como *.

97
10
2011-04-20 14:24:07 +0000

La página del hombre para el cp dice:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Prueba;

cp -rp /public-back/templates/* /public/templates/
10
5
2016-02-17 07:43:21 +0000

Cuando muevo elementos de mi unidad de disco duro a mi sistema OSMC, he encontrado muy útil lo siguiente:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Explicación de cómo funciona abajo.

BTW, No olvides añadir una barra invertida antes de cualquier espacio en los nombres de los directorios de origen o destino (ver arriba).

find finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec Executes a command, in our case mv

-v Verbose, so you can see what's happening (optional)

{} is replaced by the name of the found object.

Efectivamente, estás encontrando todos los archivos y todas las carpetas y moviéndolos uno por uno (o si un directorio se encuentra primero, estás moviendo ese directorio y el contenido en él). Esto inicia un nuevo proceso para cada movimiento y es muy ineficiente. Utilízalo sólo cuando los comandos regulares fallen.

5
2
2017-09-06 07:05:14 +0000
cp -a --link ../public-back/* /public/. && rm -rf ../public-back

Así que crea enlaces duros en el directorio de destino y elimina el dir de origen. 'mv' simplemente no funcionará en tu caso, y en general sólo funciona cuando el dir de origen y el de destino no tienen subárboles comunes.

Ten en cuenta que asumo que la palabra 'mover' en la pregunta significa que el dir de origen debe desaparecer después de la operación.

2
2
2015-10-20 15:24:37 +0000

Parece que MV no hace esto. Pero puedes usar este pequeño truco, funciona como un encanto:

tar cf - . |(cd /targetdir; tar xvf -)

y conserva los permisos y todo.

Nota: nada de lo anterior funcionó para mí, por eso esta solución.

2

Preguntas relacionadas