在 Bash 中对文件/文件夹输出进行排序

在 Bash 中对文件/文件夹输出进行排序

我有这样的输出(字母数字):

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

我需要对输出本身进行排序以首先显示目录,如下所示:

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

答案1

我认为以下命令很接近:

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

它有什么作用?第一个sed命令在每个目录的开头添加一个d(通过查找以 结尾的字符串/),并f在文件(不以 结尾的文件)中添加一个/。然后我们应用sort- 由于d在 之前排序f,因此目录首先排序。第二个命令sed撤消第一个命令。

对于示例输入:

$ sed -r 's:([^/]*/):d\1:g; s:([^/]+)$:f\1:' foo.txt |
 sort |
 sed -r 's:/f:/:; s:d([^/]*/):\1: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

相关内容