Copiar contenidos del directorio actual a un subdirectorio


13

¿Cómo puedo usar el terminal de Linux para copiar todo en el directorio actual a un subdirectorio?


¿Te refieres a copiar o mover?
— Craig

Respuestas:


12

Si desea copiar el contenido de la carpeta de forma recursiva (arrojará 1 error, alternativas a continuación):

cp -r * sub/

Un poco más hacky, pero funciona en subdirectorios no vacíos:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Otro oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

O recursivo:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

esto no funciona en caso de que sub / no esté vacío -> sub se copiará en sub nuevamente, a menos que eso sea lo que @Oguz quería.

Ok, finalmente estoy satisfecho con el findcódigo: D
— Lekensteyn

2
Su segundo comando falla para los nombres de archivo que incluyen espacios. Use xargso -exec. No es necesario grep- uso ! -name "$TARGETDIR"o similar. Tienes citas inigualables $file. No creo que un recursivo cpfuncione como pretendes en cualquier otro que no sea tu primer comando.
— Pausado hasta nuevo aviso.

Wohaa, se perdió una cita en los últimos códigos. Buen comentario Dennis, nunca pensé en usar -name en este caso :)
— Lekensteyn

4

Supongamos que targetes el nombre del subdirectorio de destino, si su shell es bash:

shopt -s extglob
cp -r !(target) target/

En ksh, puedes hacerlo directamente cp -r !(target) target/.

En zsh, puedes hacer setopt ksh_globentonces cp -r !(target) target/. Otra posibilidad es setopt extended_globentonces cp -r ^target target/.


2

Sugeriría mover el directorio de destino fuera del directorio de origen y luego volverlo a colocar; mv es gratuito (si tiene cuidado de no moverse a un sistema de archivos diferente), a menos que espere que otros procesos interfieran / sean interferidos.

La mayoría de las soluciones publicadas anteriormente no funcionarán si hay espacios en los nombres de archivo. Sugeriría usar variantes de find -print0 | xargs -0 o find -exec, etc.


0

Funcionara para ti?

cp -r * subdir/

Si quisiera mover en lugar de copiar todo en el directorio actual a un subdirectorio, podría hacer lo siguiente:

mv * subdir/

esto no se ocupa de los directorios no vacíos

Acabo de probar, y funcionó.
— karlphillip

debe copiar los directorios no vacíos de forma recursiva como sugirió @Lekensteyn.

-1

Esto copiará todo, incluidos los archivos de puntos, y sin incluir el directorio de destino en sí, en el directorio de destino SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
Falla para los nombres de archivo que incluyen espacios.
— Pausado hasta nuevo aviso.

-1

Esto va en decir archivo dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

ejecútelo como "sh dirCopy.sh" en su consola


2
No hay necesidad de ls: for file in *. No hay necesidad de backticks - uso $(). No hay necesidad de backticks (o $()) alrededor del cpcomando (que producirá un mensaje de error).
— Pausado hasta nuevo aviso.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.