¿Cómo puedo usar el terminal de Linux para copiar todo en el directorio actual a un subdirectorio?
¿Cómo puedo usar el terminal de Linux para copiar todo en el directorio actual a un subdirectorio?
Respuestas:
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
findcódigo: D
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.
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/.
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.
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 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
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
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).