Bash 如何在mac终端中按图形窗口中显示的顺序打印文件夹中的文件名?
更新: 我按照评论说的那样,将localeBash 如何在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
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
实用程序和Bash的路径名扩展(globbing;例如,ls
)对文件名进行排序*
区分大小写-这在类Unix系统上很典型
没有
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
reportLC\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)