Esta resposta usa Python. Como o OP queria remover os diretórios cobertos por seus pais, como eu tinha visto como uma possibilidade, comecei a escrever um programa diferente para remover coberturas:
Exemplo:
$ echo -e '/home/dave\n/home/dave/file1\n/home/dave/sub2/file2\n/home/phil\n/home/phil/file1' | removecoverings
/home/phil
/home/dave
Código do comando removecoverings
:
#!/usr/bin/env python2
import sys
def list_startswith(a, b):
if not len(a) >= len(b):
return False
return all(x == y for x,y in zip(a[:len(b)],b))
def removecoverings(it):
g = list(it)
g.sort(key=lambda v: len(v.split('/')), reverse=True)
o = []
while g:
c = g.pop()
d = []
for v in g:
if list_startswith(v.split('/'), c.split('/')):
d.append(v)
for v in d:
g.remove(v)
o.append(c)
return o
for o in removecoverings(l.strip() for l in sys.stdin.readlines()):
print o
Esta resposta usa Python. Ele também faz um prefixo comum componente-sábio em vez de string-wise. Melhor para caminhos, pois o prefixo comum de /ex/ample
e /exa/mple
deve ser /
não /ex
. Isso pressupõe que o que é desejado é o maior prefixo comum e não uma lista de prefixos com seus revestimentos removidos. Se você tem /home/dave /home/dave/file1 /home/phil /home/phil/file2
e espera /home/dave /home/phil
em vez de /home
. Esta não é a resposta que você estaria procurando.
Exemplo:
$ echo -e '/home/dave\n/home/dave/file1\n/home/dave/sub2/file2' | commonprefix
/home/dave
Código do comando commonprefix
:
#!/usr/bin/env python2
import sys
def commonprefix(l):
# this unlike the os.path.commonprefix version
# always returns path prefixes as it compares
# path component wise
cp = []
ls = [p.split('/') for p in l]
ml = min( len(p) for p in ls )
for i in range(ml):
s = set( p[i] for p in ls )
if len(s) != 1:
break
cp.append(s.pop())
return '/'.join(cp)
print commonprefix(l.strip() for l in sys.stdin.readlines())