Есть ли какой-нибудь инструмент для поиска файлов в одном каталоге, но не в другом? [дубликат]

Creo haber encontrado la respuesta a mi pregunta. He descargado el código fuente de gdm3 y he localizado dónde está configurado el socket para xdmcp.

static gboolean
open_port (GdmXdmcpDisplayFactory *factory)
{
        struct sockaddr_storage serv_sa = { 0 };

        g_debug ("GdmXdmcpDisplayFactory: Start up on host %s, port %d",
                 factory->priv->hostname ? factory->priv->hostname : "(null)",
                 factory->priv->port);

        /* Open socket for communications */
#ifdef ENABLE_IPV6
        factory->priv->socket_fd = do_bind (factory->priv->port, AF_INET6, &serv_sa);
        if (factory->priv->socket_fd < 0)
#endif
                factory->priv->socket_fd = do_bind (factory->priv->port, AF_INET, &serv_sa);

        if G_UNLIKELY (factory->priv->socket_fd < 0) {
                g_warning (_("Could not create socket!"));
                return FALSE;
        }

        fd_set_close_on_exec (factory->priv->socket_fd);

        if (factory->priv->use_multicast) {
                setup_multicast (factory);
        }

        return TRUE;
}

Aquí se puede ver que si el paquete se creó para admitir IP6 y la operación de vinculación finaliza correctamente, el socket solo escuchará UDP6 y no UDP4.

La solución debe ser reconstruir el paquete sin el soporte de IP6, o modificar el código fuente para que se incluya un nuevo parámetro para habilitar/deshabilitar IP6 desde el archivo /etc/gdm3/daemon.conf.


Se actualizó más información de los comentarios.

static int
create_socket (struct addrinfo *ai)
{
        int sock;

        sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol);
        if (sock < 0) {
                g_warning ("socket: %s", g_strerror (errno));
                return sock;
        }

#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
    if (ai->ai_family == AF_INET6) {
        int zero = 0;
        if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
            g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
    }
#endif

        if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) {
                g_warning ("bind: %s", g_strerror (errno));
                close (sock);
                return -1;
        }

        return sock;
}

Y podemos ver lo siguiente en el sistema de archivos proc:

$ cat /proc/sys/net/ipv6/bindv6only 
0

Por lo tanto, parece que no se realiza ningún enlace dual. Debería ser porque IPV6 _V6ONLY está definido.


Después de reconstruir el paquete sin soporte ip6:

udp        0      0 0.0.0.0:177             0.0.0.0:*                           - 
0
06.11.2018, 03:13
1 ответ

Да, для этой цели можно использовать diff. Это так же просто, как:

diff -rq dir1 dir2

Опция -rсообщает diffтакже рекурсивно обращаться к подкаталогам -. Параметр -qуказывает diffсообщать только о различиях в файлах.

Эти две опции я обычно использую, когда хочу узнать, какие файлы находятся в dir1, а какие нет в dir2, и наоборот. (Вы также можете отбросить параметр -r, если вы не хотите рекурсивно обращаться к подкаталогам -, а рассматриваете только непосредственное содержимое двух каталогов.)

Обратите внимание, что это покажет вам как файлы, которые существуют в dir1, но не в dir2, так и файлы, которые существуют в dir2, но не в dir1, например.:

$ diff -rq /tmp/dir1/ /tmp/dir2/
Only in /tmp/dir1/: file1
Only in /tmp/dir2/: file2
Only in /tmp/dir2/: file3

Если вам нужно только одно из направлений (, например, файлы, которые находятся в dir1, но не в dir2), и получить список имен файлов только (без помех "Только в..." ), вы, конечно, можете попытаться массировать вывод diffс помощью grep, sed, awkи т.п., но в этом случае лучше вообще не использовать diff. и вместо этого используйте решение Stéphane Chazelas.

9
28.01.2020, 02:13

Теги

Похожие вопросы