Cómo copiar con cp y excluir archivos o directorios internos (equivalente a rsync –exclude)

Si yo les pidiera que mencionen un comando para copiar una carpeta hacia otro lugar, casi todos mencionarían a cp.

Ahora, si les digo que además, deben copiar todo el contenido de esa carpeta excepto 1 archivo, ahí muchos se quedarían pensando, y otros mencionarían a rsync, pues con el parámetro –exclude se puede excluir X archivo o carpeta y no copiarla. Pero… ¿sabían que cp también permite hacer esto? … O_O … sí amigos, cp tiene su propio “exclude” jeje.

Por ejemplo, tenemos la carpeta isos que contiene: ubuntu.iso, debian.iso y archlinux.iso :

Y sucede que deseamos copiar hacia la otra carpeta (distros-deb, que está vacía) el archivo debian.iso y ubuntu.iso, o sea, todos menos archlinux.iso

Para ello podríamos copiar un archivo y luego otro, manualmente, pero es mucho más inteligente usar las opciones que nos brinda el sistema no? … 😀 … por ejemplo, para hacer esto basta con:

cp isos/!(archlinux.iso) distros-deb/

Y esto basta para que se copie TODO lo que contenga el directorio isos hacia distros-deb, todo excepto archlinux.iso 😉

Pero supongamos que no solo tenemos esos 3 archivos, sino que además tenemos fedora.iso y chakra.iso … y queremos hacer lo mismo, quedaría excluir también de la copia fedora.iso y chakra.iso, veamos cómo hacerlo:

cp isos/!(archlinux.iso|fedora.iso|chakra.iso) distros-deb/

Como pueden ver, se puede excluir varios archivos o carpetas, solo los separamos por una tubería (|) y asunto resuelto 😀

Con esto no quiero decir que cp sea mejor para todo que rsync … pero, ambos son excelentes herramientas, por ejemplo … ¿conocían el parámetro -u de cp? … jeje, seguro que no 😉

Bueno, nada más que agregar … ¿a que este es un interesante tip? 😀

Saludos


18 comentarios

  1.   Josh dijo

    No conocía este método, siempre se aprende algo nuevo.
    Excelente tip, gracias.

    1.    KZKG^Gaara dijo

      Gracias 🙂

  2.   croto dijo

    Muy bueno el tip, no lo conocía! Solo resta explicarles a los usuario de Arch y Fedora porque excluiste sus iso´s jeje

    1.    KZKG^Gaara dijo

      JAJAJAJAJAJA no puse los ISOs de Arch y Fedora porque el ejemplo trataba de copiar solo distros Deb… JAJAJAJAJA.

  3.   hexborg dijo

    Aquí hay que hacer un par de puntualizaciones. Una es que esto sólo funciona si está activada la opción extglob del bash. Si no lo está se activa con este comando:

    shopt -s extglob

    Se puede poner en el .bashrc para tenerla activada siempre.

    La otra puntualización es que este truco no es una opción del comando cp, sino que funciona a nivel del bash. Lo que significa que se puede usar con cualquier comando. No sólo con cp. Podéis hacer la prueba escribiendo:

    echo Ficheros: isos/!(archlinux.iso|fedora.iso|chakra.iso)

    Por lo demás es un truco muy útil. Junto con la opción -u de cp, que también me resulta útil de vez en cuando.

    1.    Daniel Rojas dijo

      Claro, es una expresión regular

      1.    hexborg dijo

        En realidad es un patrón extendido. Una expresión regular es otra cosa, pero se parece. 🙂

    2.    KZKG^Gaara dijo

      Sí, la -u de cp es verdaderamente interesante. Reconozco que soy un gran fan de rsync … pero no sé, le tengo apego al pobre cp hahaha.

      Sobre lo de activar shopt, no lo sabía, asumí que esto funcionaba automáticamente, gracias por el dato.

      Y sí, estaba sospechando que tenía más que ver con Bash que con cp, pero aún no había probado hacer un rm o un cat o algo así 🙂

      Gracias por el comentario, de veras que sí 😀

      1.    hexborg dijo

        Es un placer aportar mi granito de arena. 🙂

        1.    KZKG^Gaara dijo

          De hecho, siempre he estado interesado en aprender de expresiones regulares… ¿te embullas y haces un post para novatos sobre eso? 😀

          1.    hexborg dijo

            ¡Jajajaja!! Ya me habéis liado. 🙂 Con lo feliz que estaba yo sin comentar… 🙂

            Pues la verdad es que me está llamando. 🙂 Pero todavía tengo que pensarlo un poco. Parece dificil de explicar.

            1.    KZKG^Gaara dijo

              jajajajaja nada no te preocupes, tú sigue comentando que así igual se aprende ajajajaja, lo importante es compartir 😀


  4.   tufadorin dijo

    Muy buen tip.Nunca te acostarás sin aprender algo nuevo.

    1.    KZKG^Gaara dijo

      Exacto, y lo mejor de todo es que yo aprendo muchísimo con los comentarios que ustedes dejan en los posts, me encanta aprender cosas raras cada día JAJAJA.

  5.   Giskard dijo

    Buen truco. No lo conocía 🙂

    1.    KZKG^Gaara dijo

      Un placer 😉

  6.   @Jlcmux dijo

    Pero cuando pones isos te refieres a poner debian.iso ubuntu.iso/!( etc etc) ? no

  7.   Heber dijo

    Efectivamente resultó ser un tip muy interesante. No solo por el artículo en sí, sino también por el valor agregado de los comentarios.
    Hermosa comunidad la de <º Linux

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.