Bash 如何在mac终端中按图形窗口中显示的顺序打印文件夹中的文件名?

Bash 如何在mac终端中按图形窗口中显示的顺序打印文件夹中的文件名?,bash,macos,terminal,Bash,Macos,Terminal,更新: 我按照评论说的那样,将localeLC\u COLLATE从zh\u CN.UTF-8更改为en\u US.UTF-8,但似乎不起作用 ls-1不起作用 我在mac上使用以下bash代码: for file in * do echo $file done 顺序与graphic窗口中的顺序不匹配,因此如何按照图形窗口显示的顺序打印文件名 如下图所示 图形窗口顺序此处使用默认顺序无: 1.txt a.txt order.sh Ub.tx 终端订单: 1.txt Ub.tx a.tx

更新: 我按照评论说的那样,将locale
LC\u COLLATE
zh\u CN.UTF-8
更改为
en\u US.UTF-8
,但似乎不起作用

ls-1
不起作用

我在mac上使用以下bash代码:

for file in *
do 
echo $file 
done
顺序与
graphic
窗口中的顺序不匹配,因此如何按照图形窗口显示的顺序打印文件名

如下图所示

图形窗口顺序此处使用默认顺序
1.txt a.txt order.sh Ub.tx

终端订单:
1.txt Ub.tx a.txt order.sh

试试这个--它在OS X上对我有效,在任何*nix上都会做同样的事情:

ls | sort -f
也就是说,将aA zZ排序,按字母顺序忽略大小写。这似乎就是OSX Finder所做的

这与此类似,但输出略有不同,默认情况下显示“隐藏”点文件:

find . -maxdepth 1

您所看到的可能是OS X的经典Mac OS传统与其后来采用的BSD Unix传统之间的文化冲突:

  • OSX Finder对文件名大小写排序不敏感

  • Unix
    ls
    实用程序和Bash的路径名扩展(globbing;例如,
    *
    )对文件名进行排序
    区分大小写-这在类Unix系统上很典型

鉴于默认的OSX文件系统——不区分大小写,查找器的行为是有意义的

更新:OP发现以下技术仅近似查找器的行为,因为查找器对包含数字的文件名应用额外的排序逻辑:嵌入的(十进制)数字序列(无论位置如何)按数字排序
没有
ls
sort
选项可以在终端中提供相同的行为。如果您知道方法,请告诉我

下面的命令创建名称包含嵌入数字的测试文件;将终端中的输出与Finder中的排序进行比较,两者有所不同:
touch{1,2,10}.txt a{1,2,10}.txt{1,2,10}z.txt«{1,2,10}»txt;ls-1f

例如,在终端中,您将看到
1.txt 10.txt 2.txt
(纯词汇排序),而Finder将显示它们的顺序为
1.txt 2.txt 10.txt
(应用于嵌入数字的数字排序)


要使
ls
像Finder一样工作,请添加
-f
选项-
ls-f
——但请注意,这也会始终输出隐藏的(
-前缀)文件,包括
;为了补偿这一点,您可以使用
grep

 ls -f | grep -v '^\.'  # lists filenames sorted case-insensitively, with no hidden files
请注意,
ls
-f
选项的真正目的是抑制排序,这意味着文件的排列顺序取决于系统。 在OSX上,您碰巧得到了不区分大小写的排序,但并非所有平台都是如此;e、 例如,在带有ext4文件系统的Ubuntu上,不保证有特定的顺序


相比之下,对于使用
*
进行全局搜索,没有直接的修复方法,但您可以使用以下方法:

sort
-f
选项执行不区分大小写的排序

要在循环中可靠地使用此功能,需要仔细构造
while
循环来代替
for

while IFS= read -r file; do
  echo "$file"
done < <(printf '%s\n' * | sort -f)
而IFS=read-r文件;做
回显“$file”

完成什么是“图形窗口”?寻找者?您是否有按某种排序方法对Finder中的文件进行排序?
locale
report
LC\u COLLATE=C
?将
LC\u-COLLATE
设置为其他值(无论
LANG
设置为假定它不是
C
)有帮助吗?LC\u-COLLATE的
区域设置的res是
zh\u-CN.UTF-8
,并且运行
LC\u-COLLATE=zh\u-CN.UTF-8;以*存档;不回显“$file”;完成
按您想要的顺序返回文件?@EtanReisner thx,但它不起作用。还有一个问题,您是如何在
查找程序
中找到默认排序顺序的?根据文件夹中的文件排序进行猜测?做得很好;事实证明,
ls-f
在OS X上也会产生不区分大小写的排序,尽管总是包含隐藏文件,包括
@lizhe:通过单击Finder中的列标题,可以按不同的文件属性排序,但如果按名称排序,这是默认情况,排序顺序始终不区分大小写。如果文件名只包含[a-zA-z]
ls | sort-f
就可以了。但是如果文件夹包含
1.txt 2.txt 11.txt
终端将显示
1.txt 11.txt 2.txt
while IFS= read -r file; do
  echo "$file"
done < <(printf '%s\n' * | sort -f)
while IFS= read -d '' file; do
  echo "$file"
done < <(printf '%s\0' * | sort -f)