GNU/Linux >> Tutoriales Linux >  >> Linux

Copia recursiva de archivos ocultos - Linux

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 a find que queremos todos los nombres que comienzan con un punto. Esto no funcionará correctamente si la variable de entorno POSIXLY_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 a find 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 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 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.


Linux
  1. Cómo encontrar un archivo en Linux en todos los directorios recursivamente

  2. Ocultar los archivos ocultos de Linux en Windows

  3. Conteo recursivo de archivos en un directorio de Linux

  4. ¿Usar SED recursivamente en Linux?

  5. Forma rápida de contar archivos recursivamente en Linux

Comando Rm en Linux

Cómo cambiar recursivamente los permisos de archivos en Linux

Cómo encontrar recursivamente y enumerar los archivos por fecha en Linux

Rsync Mostrar barra de progreso al copiar archivos en Linux

Cómo listar archivos recursivamente en Linux

Cómo mostrar archivos ocultos en Linux