为什么通配符不能按我期望的方式工作?


11

在我的用户文件夹,我有这样的文件夹d ropbox,d ocuments,d ownloads&d UMP。

ls a*应该列出名称以开头的所有文件a。对?但是,当我给出命令时ls d*,不仅仅显示dump它,还向我显示了转储目录的ls。当我将命令指定ls D*为时,它将显示以D开头的所有折叠的ls

那么我想念的是哪一部分呢?

编辑:附加屏幕截图 ls屏幕截图

Answers:


17

根据bash手册页:

bash会在每个单词中扫描字符* 、?和[。如果出现这些字符之一,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表

并从信息节点获取ls

“ ls”程序列出了有关文件(任何类型,包括目录)的信息。像往常一样,选项和文件参数可以任意混合。

对于作为目录的非选项命令行参数,默认情况下,“ ls”以递归方式列出目录的内容,而不是以递归方式列出,并省略名称以“。”开头的文件。对于其他非选项参数,默认情况下,“ ls”仅列出文件名。如果未指定非选项参数,则“ ls”列出当前目录的内容。

因此,当yo Give时ls d*d *扩展为以d开头的所有文件/目录名称的排序列表。所以你的命令变成

ls dump

并且由于dump是目录名,因此您将获得目录“ dump”中所有文件的清单,但是当您给出时ls D*D *扩展为“ Desktop Documents Downloads Dropbox ”,因此该命令变为

ls Desktop Documents Downloads Dropbox

由于所有这些都是目录,因此您将获得单个目录中的文件列表。如果当前目录中有一个以D开头的文件,则该文件将单独列出。


2
较小的补充:当给出多个目录作为参数时,ls在列出目录内容之前显示其名称。它不会对单个目录执行此操作。
Marcel Stimberg 2011年

谢谢!这消除了我的怀疑。我做了一个ls p*,它显示了一个文件,因为它存在,并且一个ls P*显示了Pictures Public文件夹,因为没有以P开头的文件。当我创建一个名为poo的目录时,它显示在ls p*
Ashfame 2011年

7

ls d *和D *都列出了分别匹配d *和D *的文件和文件夹,其行为是相同的,您的测试中肯定有一个错误。

如果仅列出文件夹名称而不列出文件夹内容,则需要使用“ -d”:

ls -d D*

我已附上屏幕截图,请看一下
Ashfame 2011年

0

如上所述,-d选择是可行的方法。新增中

alias ld='ls -d'

我的~/.bashrc档案对我来说效果很好。


3
使用此别名,您可以阻止对的轻松访问ld - The GNU linker,这将阻止OP编译和链接程序。使用alias lsd='ls -d'代替。在像foo往常一样使用别名之前,type foo先查看是否foo已经用作别名,并确定别名的便利性是否会覆盖对先前别名的访问权限foo
waltinator
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.