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:
-H
causaráfind
no 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 1
detendráfind
de descender recursivamente a cualquier directorio cuyo nombre comience con un punto. No necesitamos que recurra,cp
lo hará por nosotros, solo necesitamos los nombres en este nivel.-name '.*'
le dice afind
que queremos todos los nombres que comienzan con un punto. Esto no funcionará correctamente si la variable de entornoPOSIXLY_CORRECT
está 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 l
son tres condiciones con un o entre ellos.-type d
coincide con directorios,-type f
coincide con archivos normales y-type l
coincide 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-o
justo detrás de él, obviamente).-exec ..... \;
le dice afind
para 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.