Hay una diferencia fundamental entre estas dos formas de argumento. Y es importante entender lo que está sucediendo.
Con ../foldersource/.
el argumento se pasa sin cambios al comando, ya sea cp
o rm
o algo mas. Depende del comando si ese punto final tiene una semántica especial o única diferente de la convención estándar de Unix de simplemente señalar el directorio en el que reside; ambos rm
y cp
parece tratarlo como un caso especial.
Con ../foldersource/*
el argumento se expande primero con el shell before el comando se ejecuta y pasa cualquier argumento. Así, rm
nunca ve ../foldersource/*
; ve la versión expandida ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1
y así. Esto es importante porque los sistemas operativos limitan la cantidad de argumentos que se pueden pasar a un comando, generalmente solo unos pocos cientos.
Cuando copias usando cp -a source/* target/
está copiando la mayoría de los archivos y directorios de source
a target
. Específicamente, los elementos que se excluyen probablemente serán archivos que comienzan con un punto (.
) en el nivel superior de source
.
Considere estos archivos (o directorios) en source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Cuando copias usando cp -a source/. target/
estás copiando todo el contenido de source
, incluidos los elementos que comienzan con un punto (.
) a target
Considere estos archivos (o directorios) en source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Si estás usando bash
, zsh
, puedes usar el dotglob
opción para cambiar el significado de *
para que incluya archivos y directorios que comiencen con un punto (yash
también tiene un dotglob
opción; sin embargo, luego incluye .
y ..
en expansiones globales que limitan su usabilidad. Ver también FIGNORE='@(.|..)'
en ksh93
).
Curiosamente, cp -a source/. target/
está garantizado nunca para crear el componente target/source
. (Por otro lado, cp -a source target/
hará una de dos cosas dependiendo de si target
ya existe. Consulte Cómo copiar una carpeta recursivamente de forma idempotente usando cp para obtener más detalles).
Cuando eliminas usando rm -rf source/*
está eliminando los archivos y directorios dentro de source
que no comienzan con un punto (.
). Sujeto al dotglob
ajuste que ya he mencionado. No eliminará el directorio source
mismo.
Cuando intenta eliminar usando rm -rf source/.
fallará, como ya han explicado otros, porque POSIX prohíbe la eliminación de una ruta cuyo último componente sea .
o ..
. El equivalente más cercano es rm -rf source
, que eliminará el source
directorio y todo su contenido sin importar si comienzan o no con un punto (.
).
No puedes hacer rm -rf ../foldersource/.
porque rm
no permite esto, como se indica explícitamente en el manual:
Cualquier intento de eliminar un archivo cuyo último componente de nombre de archivo es '.' o '..' se rechaza sin ninguna indicación, según lo dispuesto por POSIX.
y en el manual POSIX man 1p rm
vemos:
Si cualquiera de los archivos punto o punto-punto se especifica como la parte del nombre base de un operando (es decir, el componente final del nombre de la ruta) o si un operando se resuelve en el directorio raíz, rm debe escribir un mensaje de diagnóstico para el error estándar y no hacer nada más con dichos operandos. .