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