【问题标题】:Sort output from ls command对 ls 命令的输出进行排序
【发布时间】:2013-08-30 10:23:20
【问题描述】:

我正在尝试对 ls 的输出进行排序。我要的顺序是这样的:

  • 任何名称以_开头的目录
  • 任何名称以 + 开头的目录
  • 所有软链接(可能包括一些点文件)
  • 所有剩余的.files
  • 所有剩余的.directories
  • 其他一切

在这些“子列表”中,所有内容都按字母顺序排序。目前我多次使用 find 命令来查找符合上述条件的文件。之后,我将 find 的输出通过管道传递给 sort,然后将整个排序列表传递给 ls:

#!/bin/bash

find1=`find . -maxdepth 1 -name "_*" -type d -printf "%f\n" | sort`
find2=`find . -maxdepth 1 -name "+*" -type d -printf "%f\n" | sort`
find3=`find . -maxdepth 1 -type l -printf "%f\n" | sort`
find4=`find . -maxdepth 1 -name ".*" -type f -printf "%f\n" | sort`
find5=`find . -maxdepth 1 \( ! -name "."  \) -name ".*" -type d -printf "%f\n" | sort`
find6=`find . -maxdepth 1 \( ! -name "_*" \) \( ! -name "+*" \) \( ! -name ".*" \) \( ! -type l \) -printf "%f\n"`
find="$find1 $find2 $find3 $find4 $find5 $find6"
ls -dfhlF --color=auto $find

这不处理任何包含空格的名称,总体上看起来有点过分。我确信有更好的方法来做到这一点。有什么想法吗?

【问题讨论】:

  • 在我的脑海中,我建议lsls -l 然后每次都搜索你想要(或不想要)的文件。请记住,grep -v 将打印 匹配模式的文件。您可以使用ls -l 的输出来查找目录和链接。
  • 解析ls 的输出是个坏主意。在最坏的情况下,会有包含换行符的文件名,在这种情况下,您无法区分这些换行符和 ls 插入的用于格式化的换行符。
  • @AdamLiss 你能详细说明一下吗?当我只想列出那些文件时,您的意思是 grep ls 的结果并搜索特定模式吗?我希望有一个强大的解决方案来按特定顺序列出目录中的内容。即输入 ll($HOME/bin 中的脚本名称)并以长列表格式(ls -al 之类的)显示目录的内容,但列表以特定方式组织。使列表更具可读性。

标签: sorting ls


【解决方案1】:

这对你有用吗?它按照您指定的顺序打印文件,但不会以彩色打印。为此,您需要在对它们进行模式匹配之前从名称中去除 ANSI 代码。事实上,它会处理嵌入空格的文件名,但不会处理可怕的病态名称,比如嵌入换行符或控制字符的文件名。

我认为awk 脚本是不言自明的,但如果您需要澄清,请告诉我。 BEGIN 行在ls 输出开始之前处理,END 行在所有输出被消耗后处理。其他行以可选条件开头,后跟用大括号括起来的一系列命令。这些命令(仅)在符合条件的那些行上执行。

ls -ahlF --color=none | awk '
  BEGIN { name_col = 45 }
  { name = substr($0, name_col) }
  name == "" { next }
  /^d/ && substr(name, 1, 1) == "_" { under_dirs = under_dirs $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "+" { plus_dirs = plus_dirs $0 "\n"; next }
  /^l/ { links = links $0 "\n"; next }
  /^[^d]/ && substr(name, 1, 1) == "." { dot_files = dot_files $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "." { dot_dirs = dot_dirs $0 "\n"; next }
  { others = others $0 "\n" }
  END { print under_dirs plus_dirs links dot_files dot_dirs others }
'

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2017-09-30
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多