如何从 oh-my-zsh 和 Mac 上的“ls”命令输出中删除文件类型分类器?

Posted

技术标签:

【中文标题】如何从 oh-my-zsh 和 Mac 上的“ls”命令输出中删除文件类型分类器?【英文标题】:How to remove file type classifier from the 'ls' command output on oh-my-zsh and Mac? 【发布时间】:2016-10-01 05:26:05 【问题描述】:

我怀疑这与我在 Mac 上的 oh-my-zsh 设置有关,但我无法弄清楚。当我在命令行上执行ls *.sh 时,我得到类似:

foo.sh* bar.sh*

我了解默认情况下,-F 应用于ls

-F 在作为目录的每个路径名之后立即显示一个斜杠('/'),在每个可执行文件之后显示一个星号('*'),一个 at 每个符号链接后的符号 ('@'),每个符号链接后的等号 ('=') 插座、每个白字后的百分号 ('%') 和竖线 ('|') 在每个之后是一个 FIFO。

我真的很想列出不带分类器的文件名。这是可取的,因为没有它,我的for:

for f in `ls *.sh` 
do
wc -l $f
done

在可执行的 shell 脚本上中断(因为尾随 *):

wc: foo.sh*: open: No such file or directory 
wc: bar.sh*: open: No such file or directory

当然,我可以轻松解决这个问题。我只是想知道我是否可以在ls 命令的输出中处理它。此外,当我的 shell 是 bash 时,这也可以正常工作。

【问题讨论】:

请参阅mywiki.wooledge.org/ParsingLs,了解为什么将ls 用于生成供人类查看的列表以外的任何其他目的通常是一个坏主意(包括在 bash 上;它也是mywiki.wooledge.org/BashPitfalls). 谢谢!我同意,ls 命令的输出 也许 而不是它的“导出接口”(它会改变吗?)。除此之外,在脚本中,如果我不能直接使用 glob(在 for f in *.sh 之类的 for 循环中),如果我要检查的那些 *.sh 文件位于脚本的 cwd,对吧?在这种情况下我们该怎么办(也许cd 到那个目录,cd 回来?) 您绝对可以遍历不同目录中的文件。不要迭代ls -1 "$dir",而是使用for path in "$dir"/*.sh; do;如果你想获得一个基本名称,file=$path##*/ 就可以了。 至于界面是否会改变,已经因平台而异。 【参考方案1】:

无需使用ls 即可生成匹配文件列表。您可以直接使用该模式:

for f in *.sh
do
    wc -l $f
done

这也有利于处理包含空格的文件名。

一般来说:ls 的输出是供人使用的,它永远不应该被解析。通常文件列表可以直接使用 globbing 生成,ls 可能提供的任何信息都可以通过其他方式检索(例如stat)。


话虽这么说:

-F 默认情况下未启用,因此有一个选项。我怀疑ls 是一个别名。你可以检查

whence -v ls

虽然 oh-my-zsh 默认为 ls 创建别名,但 -F 不是设置的一部分。

如果您只想使用未修改的 ls(可能有不同的选项),您可以在前面添加 command 前置命令修饰符:

command ls

这将运行外部命令ls(通常是/bin/ls)而不是别名或函数。

如果您想永久删除-F,您可以在配置的最后某处覆盖它。或者您追踪它的设置位置并在那里进行更改。此命令可能有助于查找设置别名的位置:

grep -r $(whence ls) ~/.zshrc ~/oh-my-zsh.sh ~/.oh-my-zsh

根据您的设置,可能会有其他配置文件。

【讨论】:

有人可能会建议将command ls 作为一种符合标准的方式来避免别名或函数执行。 @CharlesDuffy 感谢您的建议。我将其添加到答案中。 酷,谢谢!在我的情况下whence -v ls 产生ls is an alias for ls -FG

以上是关于如何从 oh-my-zsh 和 Mac 上的“ls”命令输出中删除文件类型分类器?的主要内容,如果未能解决你的问题,请参考以下文章

mac 技能- 终端(oh-my-zsh)终极美化及必备插件推荐

Mac安装zsh oh-my-zsh

oh-my-zsh太慢怎么办?

Mac上快速安装oh-my-zsh

Mac 配置 oh-my-zsh 和命令行自动补全

oh-my-zsh终端用户名设置(PS1)