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.