¿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
find
código: D
xargs
o -exec
. No es necesario grep
- uso ! -name "$TARGETDIR"
o similar. Tienes citas inigualables $file
. No creo que un recursivo cp
funcione como pretendes en cualquier otro que no sea tu primer comando.
Supongamos que target
es 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_glob
entonces cp -r !(target) target/
. Otra posibilidad es setopt extended_glob
entonces 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 cp
comando (que producirá un mensaje de error).