Mueve archivos y carpetas de forma recursiva en Linux

75

Considerar:

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 forma /public-back/templatesrecursiva con permisos /public/templates?

siliconpi
fuente
mv ../public-back/templates/* public / templates /
mv -R ../public-back/templates/* public/templates/Todavía votaría para mover la pregunta.
2
mv: opción no válida - R @Vladislav Zorov
3
hice cp -a ../public-back/templates/ public /

Respuestas:

92

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

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

Además, a menos que tenga una gran lista de archivos, agregar -ipreguntará antes de sobrescribir cualquier cosa, lo que agrega cierta seguridad al usar comodines como *.

DQdlM
fuente
14
Esto no mueve archivos ocultos.
Arda
2
Consulte askubuntu.com/a/259386/358964 para configurar dotglob para que los archivos ocultos también se muevan.
mkobit
3
Nota: Esto no sobrescribirá los archivos en subdirectorios. Recibirás un Directory not emptymensaje.
Armstrongest
Parece que aplanó la jerarquía de directorios. No conservé carpetas dentro de la carpeta original para mí. Todos los archivos terminaron en la misma carpeta, en lugar de mover literalmente la carpeta original con la misma estructura.
Robert Noack
Esta solución funciona, pero si usted ve este error: mv: target '/public/templates' is not a directorybasta con crear la carpeta de destino manualmente: mkdir /public/templates.
Ali Shabdar
8

La página del manual para cp dice:

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

Tratar;

cp -rp /public-back/templates/* /public/templates/
Himalaya
fuente
13
mves para moverse , mientras que cpes para copiar : una distinción semántica / etimológica.
Marius Butuc
cpes la forma más lenta que mv. cpobliga a la computadora a copiar todo desde el disco a la RAM y luego volver a escribirlo en el disco, lo que puede llevar mucho tiempo dependiendo del tamaño de los archivos. Sin embargo, mvsiempre ocurre instantáneamente porque solo los enlaces deben reescribirse.
Tjespe
4

Al mover elementos de mi memoria USB a mi sistema OSMC, he encontrado lo siguiente muy útil:

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

Explicación sobre cómo funciona a continuación.

Por cierto, no olvides agregar una barra diagonal inversa antes de cualquier espacio en los nombres de directorio 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á encontrando todos los archivos y todas las carpetas y moviéndolos uno por uno (o si primero se encuentra un directorio, está moviendo ese directorio y los contenidos que contiene). Esto inicia un nuevo proceso para cada movimiento y es muy ineficiente. Solo use esto cuando los comandos regulares fallan.

Pi Hard
fuente
2

mv no parece hacer 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: ninguno de los anteriores funcionó para mí, es por eso que esta solución.

svye
fuente
1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Así que cree enlaces duros en el directorio de destino y elimine el directorio de origen. 'mv' simplemente no funcionará en su caso, y en general solo funciona cuando el directorio fuente y el destino no tienen subárboles comunes.

Tenga en cuenta que supongo que la palabra 'mover' en la pregunta significa que el directorio de origen debería desaparecer después de la operación.

Boudewijn
fuente