如何从 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”命令输出中删除文件类型分类器?的主要内容,如果未能解决你的问题,请参考以下文章