it-swarm-es.com

Copia recursiva de archivos ocultos - Linux

¿Hay una manera fácil de copiar recursivamente todos los archivos ocultos en un directorio a otro directorio? Me gustaría hacer una copia de seguridad de todos los archivos de configuración en un directorio de inicio, no los archivos normales. Lo intenté:

cp -R .* directory

pero reconoce . y .. y también copia recursivamente todos los archivos no ocultos. ¿Hay alguna manera de hacer que cp ignore . y ..?

19
Zifre

Mi favorito para mover directorios en general ha sido:

tar cvf - . | (cd /dest/dir; tar xvf -)

que bloquea el directorio actual para stdout y luego lo canaliza a una subshell que primero los cd al directorio de destino antes de descomprimir stdin. Simple, directo, extensible: considere lo que sucede cuando reemplaza el () con un ssh a otra máquina. O para responder a su pregunta, puede hacer:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
15
pjz

Casi siempre esto se puede resolver solo con:

cp -R .[a-zA-Z0-9]* directory

Es bastante inusual tener un archivo oculto que no comienza con uno de esos personajes.

Hay otras coincidencias de patrones disponibles (.??*, .[^.]*) - ver los comentarios

19
Alnitak

Podrías usar rsync.

rsync -a ./ /some/other/directory/

que copiará el contenido del directorio actual (incluidos los archivos de puntos, pero sin incluir ..)

11
Rory

Te lo ruego, aléjate de la simple expansión de Shell en la línea de comando cp - La expansión de Shell tiene todo tipo de ejem esquina "interesante" casos (recursión no deseada causada por. y ..., espacios, material no imprimible, enlaces duros, enlaces simbólicos, etc.) Utilice find en su lugar (viene en el paquete findutils, en en caso de que no lo tenga instalado, lo cual sería extraño, todas las distribuciones lo instalan por defecto):

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 Hará que find no siga los enlaces simbólicos (excepto si el nombre real del directorio de nivel superior que le dio es un enlace simbólico; eso 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 directorios que desea apoyo.
  • -maxdepth 1 Detendrá find de descender recursivamente a cualquier directorio cuyo nombre comience con un punto. No necesitamos que se repita, cp lo hará por nosotros, solo necesitamos los nombres en este nivel.
  • -name '.*' Le dice a find que queremos todos los nombres que comiencen con un punto. Esto no funcionará correctamente si se establece la variable de entorno POSIXLY_CORRECT, Pero rara vez (si es que 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 interpretados (mal) 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 ellas. -type d Coincide con los directorios, -type f Coincide con los archivos normales y -type l Coincide con los enlaces simbólicos. Puede seleccionar lo que desee; por ejemplo, si no desea hacer 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 a find que ejecute un comando cada vez que se encuentra una coincidencia. El final del comando está marcado con un punto y coma, del que nuevamente debemos escapar con una barra diagonal inversa para evitar la interpretación de Shell. Dentro de esa línea de comando, debe usar {} Donde desea que termine el nombre de la coincidencia encontrada actualmente. Como las conchas también pueden malinterpretar las llaves, debe colocarlas en apóstrofes, como en '{}'. El comando que queremos ejecutar en este caso es cp -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 inglés simple, esta línea de comando find dice esto:

Comience en/path/to/toplevel/dir /. No descienda a ningún subdirectorio. Encuentra todos los directorios, archivos y enlaces simbólicos cuyo nombre comienza con un punto. Para cada uno de los que haya encontrado, cópielo en/path/to/destination/dir/preservando la naturaleza, los permisos y los atributos extendidos.

10
Mihai Limbăşan

Siempre he usado. ?? * para encontrar archivos ocultos sin obtener "." y "..". Sin embargo, podría faltar ".a" o algo así, pero nunca tengo uno de esos.

8
Paul Tomblin

Respuestas mucho mejores aquí; https://superuser.com/questions/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con

Describe, por ejemplo, el uso de shopt para una solución bash nativa

0
Roel Van de Paar