Solución 1:
Casi todas las veces esto se puede resolver simplemente con:
cp -R .[a-zA-Z0-9]* directory
Es bastante inusual tener un archivo oculto que no comience con uno de esos caracteres.
Hay otras coincidencias de patrones disponibles (.??* , .[^.]* ) - ver los comentarios
Solución 2:
Mi favorito para mover directorios en general ha sido:
tar cvf - . | (cd /dest/dir; tar xvf -)
que carga el directorio actual en la salida estándar y luego lo canaliza a una subcapa que primero envía un CD al directorio de destino antes de descomprimir la entrada estándar. Simple, directo, extensible:considere lo que sucede cuando reemplaza el () con un ssh en otra máquina. O para responder a su pregunta, puede hacer:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Solución 3:
Podrías usar rsync .
rsync -a ./ /some/other/directory/
que copiará el contenido del directorio actual (incluidos los archivos de puntos, pero sin incluir .. )
Solución 4:
Te lo imploro, aléjate de la expansión de shell simple en el cp línea de comando:la expansión de shell tiene todo tipo de ejem casos de esquina "interesantes" (recurrencia no deseada causada por . y .., espacios, cosas no imprimibles, enlaces físicos, enlaces simbólicos, etc.) Use find en cambio (viene en el findutils paquete, en caso de que no lo tenga instalado, lo que sería extraño, todas las distribuciones lo instalan de forma predeterminada):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Explicación paso a paso:
-Hcausaráfindno seguir enlaces simbólicos (excepto si el nombre real del directorio de nivel superior que le dio es un enlace simbólico; seguirá)./path/to/toplevel/dir/obviamente, se supone que debe ser reemplazado por usted con la ruta del directorio que aloja los archivos de configuración y los directorios que desea respaldar.-maxdepth 1detendráfindde descender recursivamente a cualquier directorio cuyo nombre comience con un punto. No necesitamos que recurra,cplo hará por nosotros, solo necesitamos los nombres en este nivel.-name '.*'le dice afindque queremos todos los nombres que comienzan con un punto. Esto no funcionará correctamente si la variable de entornoPOSIXLY_CORRECTestá configurado, pero rara vez (o nunca) lo está. Esta es la primera condición de coincidencia que hemos especificado hasta ahora.a \( ....... \)es un y seguido de una condición más compleja entre paréntesis (he usado ..... para reemplazarlo, se explica a continuación). Necesitamos escapar de los paréntesis ya que de lo contrario serán (mal) interpretados por el shell, de ahí la barra invertida frente a ellos,-type d -o -type f -o -type lson tres condiciones con un o entre ellos.-type dcoincide con directorios,-type fcoincide con archivos normales y-type lcoincide con los enlaces simbólicos. Puede seleccionar lo que desee; por ejemplo, si no desea realizar una copia de seguridad de los directorios de configuración, omita-type d(y el-ojusto detrás de él, obviamente).-exec ..... \;le dice afindpara ejecutar un comando cada vez que se encuentra una coincidencia. El final del comando está marcado por un punto y coma, del cual nuevamente debemos escapar con una barra invertida para evitar la interpretación del shell. Dentro de esa línea de comando, debe usar{}donde desea que termine el nombre de la coincidencia encontrada actualmente. Dado que las conchas también pueden malinterpretar las llaves, debe colocarlas entre apóstrofes, como en'{}'. El comando que queremos ejecutar en este caso escp -a '{}' /path/to/destination/dir/(-a significa archivo, que se repite en subdirectorios, copia enlaces simbólicos como enlaces y conserva permisos y atributos extendidos, y/path/to/destination/dir/es obviamente el nombre del directorio de destino; reemplácelo.)
Entonces, en lenguaje sencillo, este find línea de comando dice esto:
Comience en /ruta/al/nivel superior/dir/. No descienda a ningún subdirectorio. Encuentre todos los directorios, archivos y enlaces simbólicos cuyo nombre comience con un punto. Para cada uno de los que haya encontrado, cópielo en /path/to/destination/dir/ conservando la naturaleza, los permisos y los atributos extendidos.
Solución 5:
Siempre he usado .??* para encontrar archivos ocultos sin obtener "." y "..". Sin embargo, puede que falte ".a" o algo así, pero nunca tengo uno de esos.