C version. Maybe this logic should be built into GNU find as an option!
$ find /etc/network | ./frangi-cheat
/etc/network
/if-post-down.d
/wireless-tools
/wpasupplicant
/avahi-daemon
/if-down.d
/resolvconf
/wpasupplicant
/avahi-autoipd
/interfaces.d
/interfaces
/if-pre-up.d
/wireless-tools
/wpasupplicant
/ethtool
/if-up.d
/ntpdate
/wpasupplicant
/000resolvconf
/openssh-server
/ethtool
/avahi-autoipd
/slrn
/avahi-daemon
$ cat frangi-cheat.c
#include
#include
#include
int main(void)
{
char old_line[FILENAME_MAX] = "", line[FILENAME_MAX];
while (fgets(line, sizeof line, stdin)) {
char *p = line, *o = old_line, *nl = strchr(line, '\n');
if (nl)
*nl = 0;
while (*p && *o) {
char *op = p;
if (*o == '/' && *p == '/')
o++, p++;
size_t lp = strcspn(p, "/");
size_t lo = strcspn(o, "/");
if (lp == lo && !strncmp(p, o, lp)) {
p += lp;
o += lp;
printf("%*s", (int) (p - op), "");
continue;
}
p = op;
break;
}
puts(p);
strcpy(old_line, line);
}
return feof(stdin) ? EXIT_SUCCESS : EXIT_FAILURE;
}
Note: yes, we could swap pointers between two buffers instead of strcpy.