在 Unix 中使用“ls”时如何排序第一个目录然后是文件等

atr*_*lla 103 unix bash ls sorting

我想使用该ls命令先显示目录,然后显示文件。我试过:

ls -la | sort -k 1
Run Code Online (Sandbox Code Playgroud)

但我收到了错误的订单。

jon*_*ini 233

我非常喜欢 *nix 并且喜欢看到其中一些回复中的创造性......

我的在 GNU Linux 上并不那么花哨:

alias ls='ls --color -h --group-directories-first'
Run Code Online (Sandbox Code Playgroud)

鉴于我对我的 linux CLI 应用程序更满意,我也倾向于更新 OSX 上的 coreutils :

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这在 osx 终端上不起作用,因为 -- 选项不可用。 (8认同)
  • 重爱:那是讽刺吗?如果是这样,我会同意。 (8认同)
  • 我的意见:这应该是公认的答案,因为它列出了一个命令行选项来完全实现目标,而不是一组复杂的 grep 等。 (7认同)
  • alias ls 的目的是定义我想在 90% 的时间使用的配置元素。减少击键次数即可获得所需的输出。如果您想拥有本机 ls 输出,您可以随时使用 /bin/ls。 (4认同)
  • @MEM 如果您使用的是 OS X 并且喜欢使用终端,则应该`brew install bash` 然后,这将起作用!:) (4认同)
  • 回复:在 mac 上不起作用...确实如此,尽管我通常会执行 brew install coreutils 来覆盖本地用户的 mac 内置程序。 (3认同)
  • @AndrewAshbacher 不,不会。一,OSX 大部分时间使用 bash 作为默认设置。其次,它没有内置的 LS。第三,它基于 BSD,而不是 GNU/Linux。上面的命令基于 GNU Coreutils LS。 (2认同)
  • 它可能没有那么花哨,但我每次都更喜欢命令行参数而不是花哨的管道到单行脚本。无需使用火箭筒杀死苍蝇。谢谢 :-) (2认同)

ele*_*n81 33

以下命令将首先列出目录,然后是普通文件,然后是链接。

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

此外,为该命令创建别名以保存击键也很有意义。

编辑:

如果您首先需要目录,然后是不是目录的所有内容,请使用以下命令:

ls -la | grep "^d" && ls -la | grep -v "^d"

  • 编辑后的版本应该仍然适用于其他类型。第一个 grep 表示以“d”开头的所有内容,第二个 grep 表示所有不以“d”开头的内容。当然,一切要么以广告开始,要么不以广告开始,对吧? (2认同)
  • 我发现了一个更短的符号:`ls -la|grep ^d;ls -la|grep -v ^d`(不需要引号,用 `;` 替换了 `&&`)。另一种选择是引入一个变量然后评估它:`a="ls -la|grep ^d";eval $a;eval $a -v`。当为 `ls`/`grep` 指定更多选项时,可能有助于避免重复。还有那个`ls -la --group-directories-first`选项,但是最短的imo是`ls -la|sort` (2认同)

Vad*_*rov 22

对于 mac 用户,您可以安装coreutils

这个公式提供了 GNU 核心实用程序的实现,对于 macOS 也提供的命令,它们已经安装了“g”前缀。

brew install coreutils
gls --color -h --group-directories-first
Run Code Online (Sandbox Code Playgroud)

您可以使用别名进一步简化您的生活

alias ls='gls --color -h --group-directories-first'
Run Code Online (Sandbox Code Playgroud)

  • 而是`gls`。对? (9认同)
  • 是的,默认情况下。你也可以默认使用 coreutils 和 `PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"`。 (2认同)
  • 2023 年仍然有效——经过一些快速搜索后我找不到更好的答案 (2认同)

thd*_*oan 7

我想在目录列表中看到某些内容,到目前为止,这里的答案都没有满足以下所有要求。我对目录列表的要求:

  1. 目录和文件按字母顺序排序
  2. 首先列出目录
  3. 符号链接(symlinks)像文件一样排序
  4. 排序不区分大小写
  5. 排序忽略文件名中的所有前导非字母字符
  6. 列表包括目录(不包括./../)、文件和链接的总数
  7. 列表包括目录和文件的总大小(磁盘使用情况)
  8. 清单必须在 Linux 和 Windows(Git Bash shell)上看起来相同——这是最难做到的,因为像--group-directories-firstWindows 版 Git Bash 这样方便的选项不起作用

经过大量的黑客攻击,我终于想出了一个令我满意的单行(尽管很长;-))。我已将此分配给名为“dir”的别名:

ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" | 
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" | 
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . | 
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f | 
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | 
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
Run Code Online (Sandbox Code Playgroud)

为了使事情更容易管理,我想出了单独的命令来根据我的喜好输出目录列表的每个部分,然后使用&&运算符将它们组合在一起。

  • ls -dlF --color * .* | head -n2- 提取./../。我们不想传递这些,sort因为它们已经按正确的顺序排列,对它们进行排序可能会导致../首先列出。该-d选项是摆脱“总”线; 我喜欢添加-F以显示目录的尾部斜杠(当您执行普通操作时,它还会用“@”标记符号链接ls -F)。

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df-- 提取目录并按文件名(第 9 列)对它们进行排序,忽略非字母/空格字符(d选项)和字符大小写(f选项)。该ls -A选项将./../从列表中排除,因为我们已经在上一步中提取了它们。我倾向于在 allgrepsort命令前面加上LC_ALL=Clocale reset 以便 (1) 输出在 Unix shell 中保持一致,并且 (2) 您有时可以看到更快的性能,因为它不再有繁重的 UTF-8 字符集的开销处理。

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df -- 这与上面的步骤类似,但这次我们对文件和符号链接进行排序。

  • find -maxdepth 1 -type d ! -name . | wc -l-- 获取目录数,不包括./../

  • find -maxdepth 1 -type f | wc -l -- 获取文件数量。

  • find -maxdepth 1 -type l | wc -l -- 获取符号链接的数量。

  • du -hs | cut -f 1 -- 以人类可读的格式提取所有子目录的总大小。

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 -- 以人类可读的格式提取所有文件的总大小。

让我们看看我们的新dir别名的作用!

前:

$ ls -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
Run Code Online (Sandbox Code Playgroud)

后:

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)
Run Code Online (Sandbox Code Playgroud)

一个小缺点是不能有彩色列表,因为文件名周围的颜色控制字符使排序太不可靠。


更新

从深层文件系统的根目录执行时,上面的别名非常缓慢,因此我已更新为这个更简单但性能更高的命令:

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes
Run Code Online (Sandbox Code Playgroud)

由于 Windows 版 Git Bash 的新版本支持--group-directories-first,我们不再需要依赖sort. 尽管新别名显示的信息不如以前的别名多,但性能提升还是值得的。作为福利,您还可以获得颜色!


Stu*_*der 6

您有多种选择,这取决于您是否想保持字母顺序。

你可以简单地尝试:

ls -al | 排序 -k1 -r

或者,为了保持具有相同权限的文件的字母顺序:

ls -al | 排序 -k1,1 -k9,9 -r

或者,正如 1181 所说(但此版本列出了所有内容):

ls -la | grep "^d" && ls -la | grep "^-" && ls -al | grep -v "^[d|-]"


Den*_*son 5

对于delerious010 的回答,如果您想要旧式排序,我会补充说:

LANG=C ls -la --group-directories-first
Run Code Online (Sandbox Code Playgroud)

(或使用 LC_ALL 或 LANGUAGE 或 LC_COLLATE 设置为“C”)。

这将给出类似于:

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Run Code Online (Sandbox Code Playgroud)

虽然,如果我没记错的话,隐藏的点文件最初出现在目录之前。