Вы можете сортировать эти строки по количеству слешей, а затем по символам и фильтровать массив, просматривая видимые пути.
var data = ['/opt/pictures/dist.xml', '/opt/docs_old/dist.xml', '/opt/public/dist.xml', '/opt/documents/server/dist.xml', '/opt/documents/dist.xml', '/opt/documents/web/dist.xml', '/opt/documents/class/dist.xml', '/opt/documents/lessons/1/dist.xml', '/opt/documents/lessons/2/dist.xml', '/opt/documents/lessons/3/dist.xml', '/opt/documents/lessons/4/dist.xml', '/opt/documents/lessons/5/dist.xml', '/opt/music/service/day/dist.xml', '/opt/music/service/week/dist.xml', '/opt/music/service/month/dist.xml', '/opt/music/service/month/1/dist.xml', '/opt/music/service/month/2/dist.xml'],
result = data
.sort((a, b) =>
a.replace(/[^\/]+/g, '').length - b.replace(/[^\/]+/g, '').length ||
a > b || -(a < b)
)
.filter(
(seen => s =>
(parts =>
!parts.some((_, i, p) => seen.has(p.slice(0, i + 1).join('/'))) &&
seen.add(parts.join('/'))
)
(s.split('/').slice(0, -1))
)
(new Set)
);
console.log(result);