更新:我按照评论说的那样将区域设置LC_COLLATE
从更改为zh_CN.UTF-8
,en_US.UTF-8
但是似乎不起作用。
05〜07_11-06-49.png http://7xpvdr.com1.z0.glb.clouddn.com/05~07_11-06-49.png
ls -1
不起作用05〜07_11-05-51.png http://7xpvdr.com1.z0.glb.clouddn.com/05~07_11-05-51.png
我在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
05〜06_12-53-21.png http://7xpvdr.com1.z0.glb.clouddn.com/05~06_12-53-21.png
您可能会看到一方面是OS X的经典Mac OS传统与另一方面的BSD Unix传统之间的文化冲突,后来又采用了:
OS X Finder不区分大小写地对文件名进行排序。
Unixls
实用程序和Bash的路径名扩展(globbing;例如*
)
区分大小写地对文件名进行排序-这在类似Unix的系统上很常见。
假定默认的OS X文件系统HFS +不区分大小写,则Finder的行为是有道理的。
更新:OP发现以下技术仅能近似Finder的行为,因为Finder应用了附加的排序逻辑,文件名中包含数字:数字(无论位置如何)嵌入的(十进制)数字序列都是按数字排序的。在终端中通常
没有提供ls
或sort
提供相同行为的选项或选项。如果您知道某种方法,请告诉我。
以下命令创建名称带有嵌入式数字的测试文件;比较在终端的输出与在搜索的顺序,这将有所不同:
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
办法是抑制排序,这意味着它是由该系统以什么顺序文件中列出。在OS X上,您碰巧会获得不区分大小写的排序,但这并非在所有平台上都是如此。例如,在具有ext4文件系统的Ubuntu上,不保证特定的顺序。
对于通配带*
,相比之下,没有直接的修复,但可以使用从接近约翰Zwinck的回答:
printf '%s\n' * | sort -f
sort
的-f
选项执行不区分大小写的排序。
为了在循环中稳健地使用它,需要精心构造的while
循环来代替for
:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句