para copiar contenidos de una carpeta que he leído, el uso es:
cp -rfva ../foldersource/. ./
pero esto también funciona
cp -rfva ../foldersource/* ./
¿hay alguna diferencia?
por ejemplo si quiero eliminar un contenido de una carpeta con. :
rm -rf ../foldersource/.
me sale el error:
rm: rejet delete folder '.' or '..':
pero con asterisco está bien
rm -rf ../foldersource/*
Entonces, ¿el asterisco es una mejor opción que funciona en cualquier lugar?
It's up to the command whether that trailing dot makes any sense
Um, el punto siempre enlaza con el directorio que lo contiene, por lo../foldersource/.
que no debería ser diferente de indicar./foldersource/
y, de hecho, es solo una forma redundante de decir lo mismo. Ningún comando intenta "dar sentido" a punto o doble punto, ya que estos son estándar en los sistemas de archivos Linux / Unix.rm
simplemente rechaza eliminar el directorio de trabajo actual como sejimmij
indica en su respuesta. Además, tenga en cuenta que está utilizando./
en todos sus ejemplos mientras OP tiene../
allí. Algo de una (gran) diferencia.cp -rfva ../foldersource/. ./
NO es equivalente acp -rfva ../foldersource ./
. El seguimiento/.
es significativo.
es una convención estándar en Unix para denotar la corriente directamente. Además, gracias por señalar que había usado./
en mis ejemplos cuando debería haber usado../
; Lo arreglaré Usted es incorrecto acerca de si los comandos "tienen sentido" del punto final; como señala el OP (y he experimentado concp
) ambosrm
y secp
comportan de manera diferente cuando hay un final.
presente. Debería haber escrito algo como "depende del comando si el punto final tiene una semántica especial o única". Cambiaré mi respuesta por claridad.Cuando copia usando
cp -a source/* target/
está copiando la mayoría de los archivos y directorios desource
atarget
. Específicamente, los elementos que están excluidos probablemente serán archivos que comienzan con un punto (.
) en el nivel superior desource
.Considere estos archivos (o directorios) en
source
Cuando copia usando
cp -a source/. target/
está copiando todo el contenido desource
, incluidos los elementos que comienzan con un punto (.
) entarget
Considere estos archivos (o directorios) en
source
Si está usando
bash
,zsh
puede usar ladotglob
opción para cambiar el significado de*
modo que incluya archivos y directorios que comiencen con un punto (yash
también tiene unadotglob
opción; sin embargo, luego incluye.
y..
en expansiones globales que limitan su usabilidad. Ver tambiénFIGNORE='@(.|..)'
enksh93
).Curiosamente,
cp -a source/. target/
se garantiza que nunca creará el componentetarget/source
. (Por otro lado,cp -a source target/
hará una de dos cosas dependiendo de sitarget
ya existe o no . Consulte Cómo copiar una carpeta de forma recursiva de forma idempotente usando cp para obtener más detalles).Cuando elimina usando
rm -rf source/*
está eliminando los archivos y directoriossource
que no comienzan con un punto (.
). Sujeto a ladotglob
configuración que ya he mencionado. No eliminará el directorio ensource
sí.Cuando intente eliminarlo
rm -rf source/.
, fallará, como ya lo han explicado otros , porque POSIX prohíbe la eliminación de una ruta cuyo último componente es.
o..
. El equivalente más cercano esrm -rf source
, que eliminará elsource
directorio y todo su contenido, independientemente de si comienzan o no con un punto (.
).fuente
rm -rf .
su defecto .No puede hacerlo
rm -rf ../foldersource/.
porquerm
no permite esto, como se indica explícitamente en el manual:y en el manual POSIX
man 1p rm
vemos:fuente