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?

Oguz Bilgic
fuente
¿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
Lekensteyn
fuente
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/.

Gilles 'SO- deja de ser malvado'
fuente
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.

alex
fuente
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/
karlphillip
fuente
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
ivern
fuente
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

Rahul
fuente
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.