当我在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)
编辑-已解决
在lftp
中,cls -l
得到正确的顺序以及我需要的全部详细信息。
echo $(lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; cd "$1"; cls -l" -u $username,$password $server)
答案 0 :(得分:2)
这与您的语言环境指定的默认排序有关。您可以找出该命令将使用哪种语言环境……嗯,让我想想……是的,就是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
。