【问题标题】:ls doesn't list my files in the right orderls 没有按正确的顺序列出我的文件
【发布时间】:2019-02-01 12:38:06
【问题描述】:

当我在 bash 中键入 ls 时,它应该默认按字母顺序检索文件和目录的名称。

不幸的是,我得到以下结果:

--  ---  00  -01  01  -02 

我期待的结果是:

--  ---  -01  -02  00  01  

文件名中的- 字符会阻止默认排序正常工作。我需要使用与 php strcmp 相同的方法对文件名进行排序。

为什么- 字符会导致排序问题?是否有任何其他字符会导致问题? bash 中准确排序文件名的最佳方法是什么?

编辑

ls 命令在我的家用计算机上使用Manjaro 和我的备份服务器上使用ltfp 命令返回相同的错误结果。

在他的回答中建议使用LC_ALL=C ls -1 作为paxdiablo,在Majaro 上测试时有效,但在使用lftp 时没有运气:

echo $(lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; cd "$1"; LC_ALL=C ls" -u $username,$password $server)

编辑 - 已解决

lftpcls -l 得到正确的顺序和我需要的全部细节。

echo $(lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; cd "$1"; cls -l" -u $username,$password $server)

【问题讨论】:

  • @codeforester,这可能因为您的默认语言环境是C,或其他按预期方式排序的语言环境。
  • 我在家用计算机上使用“Manjaro”,但是,我在使用lftp 的备份服务器上执行ls 命令。 LC_ALL=C ls -1 适用于 Majaro,但不适用于我的备用服务器 lftp
  • @DanBray 简要浏览一下 lftp 的手册页说“lftp 具有类似 shell 的命令语法”,所以我猜 shell-like 它实际上并没有给出你是一个完整的外壳,所以它不支持 LC_ALL=C 语法。您可能需要研究其他设置环境变量的方法。
  • 顺便说一句,echo $(lftp ...) 语法是怎么回事,而不是仅仅运行 lftp?这会产生一些非常不幸的副作用——例如,如果有人创建了一个名为 * READ ME FIRST * .txt 的本地文件,那么 *s 将被替换为本地文件名。
  • 请使用“添加答案”按钮添加您自己的答案,而不是将其编辑到问题中。

标签: bash sorting ls


【解决方案1】:

这与您的语言环境指定的默认排序有关。您可以找出该命令将使用什么语言环境......嗯,让我想想,......是的,就是这样,locale :-)

pax$ locale
LANG=en_AU.UTF-8
LANGUAGE=en_AU:en
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=

如果您将语言环境设置为更合理 (a),您会看到它按预期运行:

pax$ ls
--  ---  00  01  -01  -02
pax$ LANG=C ls
--  ---  -01  -02  00  01

(a) 在这个问题的上下文中定义为C

【讨论】:

  • 使用 Majaro 测试时使用 LC_ALL=C ls -1 有效,但是当我在备份服务器上使用 lftp 命令时,我得到相同的错误结果或没有结果。
  • @DanBray,对——FTP协议不允许你运行shell命令(lftp中的ls实际上并没有调用/bin/ls),所以你不能设置环境变量.嗯,一般来说——lftp 有很多它支持的后端协议,它们的工作方式各不相同。
  • @Dan,对语言环境的支持已融入您尝试使用的任何程序中。 lftp 很可能不知道或不关心语言环境。如果是这种情况,您可能可以在lftp 之外以排序方式构建命令,然后传入正确的字符串。换句话说,调用lftp 将文件放入一个列表中,使用bash/sort 对该列表进行排序,然后将带有运动列表的命令传递回lftp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多