我想在Macbook上找到一个文件名为abc.dmg的文件。我尝试使用聚光灯,但找不到。当我尝试查找并使用:find -name abc.dmg -path /时,出现了错误。

在Mac OSX终端上使用find命令按文件名查找文件的正确语法是什么?

评论

@VxJasonxV对于超级用户,Apple问题是100%的主题,并且不需要真正将每个Apple问题都移到那里。 iPhone或iPad问题将在需要时/在需要时转移。

这并不是造成主题偏离主题的原因,而是这个通用主题有一个更具体的主题/站点的事实。

@Diago:在meta或chat上有关于此的任何讨论吗?我只是想知道,因为AFAIK apple.SE即将在Beta版之外发布,所以很高兴让所有人都在同一页面上。
@calavera。相当古老的讨论但相关的可以在这里找到。 Apple SE,Ubuntu SE和Linux SE都是超级用户的称赞,但我们绝不希望强迫用户迁移。我更喜欢在这里问苹果问题,而不是苹果,因为我确实使用3种不同的操作系统。如果我有一个非常具体的问题,请在一个更专业的网站上提问。

#1 楼

以其最简单的形式,find采用一个参数:路径。按照其实际有用的形式,它采用了紧缩条件后的路径。

因此,您需要:




find(程序)

/(路径)和

-name abc.dmg(条件)。

find / -name abc.dmg


评论


搜索整个驱动​​器时,您可能会遇到权限被拒绝的类型错误,但是除非您希望文件位于受限制的文件夹中,否则可以将其忽略。如果是这样,请使用sudo find / -name abc.dmg

–克里斯·纳瓦(Chris Nava)
2010-12-28 18:31

尝试过,但没有结果。

– SPRBRN
2010-12-28 18:55

大概那时,您的计算机上没有名为abc.dmg的文件。您可以使用-iname而不是-name来使搜索不区分大小写。我非常怀疑您实际上是在搜索“ abc.dmg”,并且鉴于(大概)事实,如果没有确切的细节,很难告诉您问题所在。

– VxJasonxV
2010-12-28 19:18

@rxt:如果找不到,就不存在...

– Robert S Ciaccio
2010-12-28 19:37

鉴于OP报告已尝试在问题文本中进行查找,因此值得注意的是,查找参数的顺序很重要。如果必须找到[路径] + [选择,分组和操作]。

– dmckee ---前主持人小猫
2010-12-28 22:21

#2 楼

例如,find . -name '*.csv'使用通配符为我工作。假设他在find . -name '*.dmg'中,OP还可以使用/检查其当前目录。

#3 楼

mdfind命令使用Spotlight数据库

http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/mdfind.1.html

评论


但是,根据OP最初的问题,Spotlight找不到它。

– VxJasonxV
2010-12-28 19:24

#4 楼

您可以使用locate命令。

locate abc.dmg


评论


注意osx标签。 slocate db默认情况下不会填充。

– VxJasonxV
2010-12-28 17:46

创建数据库后尝试过,但是没有结果。

– SPRBRN
2010-12-28 18:56

如果定位和mdfind均失败,则可能是该文件不在您的计算机上。或者它没有命名,你怎么认为它的命名。也许搜索所有DMG可能是您的下一步?

– Peelman
2010-12-28 19:20

#5 楼

最简单的方法(我确定您已经尝试过,但是无论如何,让我将其添加到线程中)是在任何查找程序窗口右上角的搜索框中输入abc.dmg,然后选择“文件“名称””出现在搜索栏上的选项中。

不需要终端。 dmg可能不在这些目录之一中。

如果我输入错误,请纠正我,但是我认为find命令需要知道输出什么:

find / -name abc.dmg -print


...应将任何结果(包括权限错误)打印到终端。

如果您不希望出现权限错误并要搜索其他用户目录,则:

sudo find / -name abc.dmg -print


#6 楼

您可以使用以下命令行功能快速查找并打开相关文件。我发现这比在Spotlight窗口中输入较长的查询字符串更容易。

~/.bash_aliases中添加以下功能。

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='**'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='**'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='**'cd" | sed -n "${FILEID}")"


}

现在,要么source ~/.bash_aliases要么打开一个新的终端加载功能。要在文件名中的任何位置搜索带有单词,饼图和2016的文件,请执行

spot pie*2016 #or
spot 2016*pie


无需在查询中添加或添加*作为搜索模式,'**'已经在查询的开头和结尾标记了通配符条目。额外的cd用于区分大小写且忽略变音符号,例如,fred将同时返回Frédéric和FrEDeric。

findpaper将搜索限制在特定路径下(递归),而openpaper pie*201将打开(搜索结果或openpaper pie*201 3将打开第三个结果条目。为避免打开bash脚本或其他非文档文件,您可以通过其他搜索属性限制文件内容。有关使用其他搜索运算符的信息,请参见文件元数据查询表达式语法和https://ss64.com/osx/mdfind.html。

评论


太棒了!静止它:D

– Atcold
19年7月15日在18:17

#7 楼

从/

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt
以root身份捕获磁盘上每个文件的列表,并通过grep捕获整个文件以搜索整个驱动​​器:

cat ~/file-list.txt | grep abc.dmg


使用正则表达式仅显示.jpg和.dmg文件:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"


结果:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg


...等。不幸的是,它还会捕获所有已安装的磁盘,因此最好弹出那些具有很多链接的Time Machine磁盘。因此,在另一个窗口中,我运行watch tail -n 10 ~/file-list.txt,它向我显示了我卑鄙的黑客行为的根源所在。

评论


错误的做法或值得一提的事情:(1)sudo find />〜/ file-list.txt似乎比以root身份运行整个外壳要好。 (2)find *将跳过/中隐藏的(点)对象(如果有)。 (3)&>是bashism。 (4)无用的猫。 (5)grep abc.dmg将显示例如/ foo / bar / 123abcXdmg456 / baz /任何。 //您的答案带给该线程的一件好事(其他答案没有)是一种方法,用户运行一次find,然后多次重复使用保存的结果,而无需一次又一次地查询文件系统。但是,这种潜在的优势并不突出。

–卡米尔·马乔洛夫斯基(Kamil Maciorowski)
19年6月9日在12:26

很好,谢谢卡米尔(Kamil),这样做了,还把$(whoami)

–东町
19年7月22日在12:00