AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 790168
Accepted
Apollucas
Apollucas
Asked: 2025-01-26 22:28:58 +0800 CST2025-01-26 22:28:58 +0800 CST 2025-01-26 22:28:58 +0800 CST

我如何使“ls”按照 Thunar 对文件进行排序的方式进行排序?

  • 772

标题是我想要实现的目标的总结,但我会举一个例子来说明我的问题是什么以及我如何尝试解决它。

示例文件夹

假设我在 Linux 系统上有一个文件夹,其中包含以下文件:.a,,,,,,和。.A.b.BaAbB

图纳尔

当我在我选择的文件管理器 Thunar 中打开文件夹时,文件按以下顺序显示:

.a
.A
.b
.B
a
A
b
B

这是对我有意义的输出;首先是隐藏文件(或目录),然后按字母顺序排序(考虑大小写)。最好将大写文件排在小写文件之前,但这也不算太糟。换句话说,这是我试图用 实现的输出ls。

ls

当我想通过列出该文件夹的文件时ls,我得到的结果如下:

$ ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B

这里,隐藏文件没有排到顶部,但文件整体上是按照“合理”的字母顺序排列的。

尝试LC_ALL=C和LC_COLLATE=C

将隐藏文件排序到顶部的几个解决方案是临时设置LC_ALL或LC_COLLATE为C(我很难看出两者之间的区别,因此非常感谢您的解释):

$ LC_ALL=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
$ LC_COLLATE=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b

如您所见,这确实解决了隐藏文件问题,但是字母排序的行为现在与 Thunar 按字母顺序对文件进行排序的方式不一致。

问题

因此,这引出了一个问题:我如何ls以与 Thunar 相同的方式进行排序?最好避免通过管道传输ls到另一个命令(如)sort,因为我想将这个新命令别名为其"ls"自身。

如果这不可能的话,我怎样才能让 Thunar 按照对文件进行排序的方式ls对文件进行排序(LC_ALL=C/LC_COLLATE=C方法对我来说似乎足够好了)?

进一步说,我想问一下按字母顺序对文件进行排序时的最佳做法是什么。我刚刚描述的行为在我看来是合理的,但也许事实并非如此?

files
  • 2 2 个回答
  • 871 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2025-01-27T00:52:01+08:002025-01-27T00:52:01+08:00

    o+funcname 如果使用 zsh,则可以定义一个与glob 限定符一起使用的通配符排序顺序函数,该函数将tail(基名)以 开头的隐藏文件放在首位.:

    thunarOrder() {
      [[ $REPLY:t = .* ]]; REPLY=$?$REPLY
    }
    

    然后按以下顺序显示当前工作目录aw on olumnprint中的文件名称:r1 C

    $ print -rC1 -- *(Do+thunarOrder)
    .a
    .A
    .b
    .B
    a
    A
    b
    B
    

    (还请注意Dotglob 限定符,因此点文件不会被跳过,否则默认情况下会跳过)。

    使用 GNU 实现ls,您可以使用-U/--sort=none选项禁用其自身的排序:

    $ ls -nUd -- *(Do+thunarOrder)
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 .a
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 .A
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 .b
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 .B
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 a
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 A
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 b
    -rw-rw-r-- 1 1000 1000 0 Jan 26 16:29 B
    

    如果您希望大写字母在小写字母之前,则可以使用丹麦语排序顺序,如下所示:

    $ LC_COLLATE=da_DK.UTF-8
    $ print -rC1 -- *(Do+thunarOrder)
    .A
    .a
    .B
    .b
    A
    a
    B
    b
    

    或者您可以切换到 C 语言环境,该环境通常根据字节值排序,并且A-ZASCII 字符集恰好位于 之前a-z。

    • 10
  2. Hauke Laging
    2025-01-27T00:01:07+08:002025-01-27T00:01:07+08:00

    对于您的主要问题:好的解决方案可能是创建一个新的LC_COLLATE定义(这可能必须在ls函数中发生,因为有人可以用...调用它LC_ALL=... ls -lA)。我不知道该怎么做。

    对于问题的LC_ALL=C/LC_COLLATE=C部分:通常应该没有区别。如果LC_ALL之前设置为不同的值,则只会有一个区别。它们的作用相同,LC_ALL=C只是影响更多配置并具有更高的优先级。

    • 4

相关问题

  • 删除文件名后缀最小的文件

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve