Ordena saída de arquivo / pasta no Bash

3

Eu tenho uma saída assim (alfanumérica):

bash /etc/file
bash /etc/filenew
bash /etc/skel/
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin

Qual eu preciso classificar (a saída em si) para mostrar os diretórios primeiro, como por exemplo:

bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
    
por Det 22.02.2016 / 14:34

1 resposta

5

Acho que o seguinte comando chega perto:

sed -r 's:([^/]*/):d:g; s:([^/]+)$:f:' foo.txt |
  sort |
  sed -r 's:/f:/:; s:d([^/]*/)::g'

O que isso faz? O primeiro comando sed adiciona um d ao início de cada diretório (procurando sequências que terminam com / ) e um f aos arquivos - aqueles que não terminam com / . Em seguida, aplicamos sort - e como d classifica antes de f , os diretórios são classificados primeiro. O segundo sed desfaz o primeiro.

Para a entrada de exemplo:

$ sed -r 's:([^/]*/):d:g; s:([^/]+)$:f:' foo.txt |
 sort |
 sed -r 's:/f:/:; s:d([^/]*/)::g'
bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
    
por muru 22.02.2016 / 16:15