如何在Mac OSX终端中按文件名查找文件?


118

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

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


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

这并不是引起主题偏离的原因,而是这个通用主题有一个更具体的主题/站点的事实。
VxJasonxV 2010年

@Diago:在meta或chat上有关于此的任何讨论吗?我只是想知道,因为AFAIK apple.SE即将在Beta版之外发布,所以让所有人都在同一页面上真是太好了。
罗伯特·西亚乔

1
@calavera。相当古老的讨论但相关的可以在这里找到。Apple SE,Ubuntu SE和Linux SE都是超级用户的称赞,但我们绝不希望强迫用户迁移。我宁愿在这里问我的Apple问题,也不愿问Apple,因为我确实使用3种不同的操作系统。如果我有一个非常具体的问题,我将在一个更专业的网站上提问。
BinaryMisfit 2010年

Answers:


163

最简单的形式是find采用一个参数:路径。它以实际有用的形式采取紧缩标准的道路。

因此,您想要:

  • find (该程序)
  • / (路径),以及
  • -name abc.dmg (条件)。
find / -name abc.dmg

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

尝试过,但没有结果。
SPRBRN

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

2
@rxt:如果找不到,就不存在……
Robert S Ciaccio 2010年

5
鉴于OP报告已在问题文本试图发现,这是值得注意的是,的参数的顺序find 问题。如果一定要find [path]+ [selection, grouping, and actions]
dmckee 2010年

23

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



6

您可以使用该locate命令。

locate abc.dmg

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

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

如果locatemdfind都失败,很可能是该文件是不是你的机器上。还是它的未命名你怎么认为它的命名。也许搜索所有DMG可能是您的下一步?
Peelman 2010年

3

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

无需终端。

还要记住,Spotlight仅索引在Spotlight控制面板中指定的目录,而abc.dmg可能不在这些目录之一中。

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

find / -name abc.dmg -print

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

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

sudo find / -name abc.dmg -print

2

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

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

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

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'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=='*$1*'cd" | sed -n "${FILEID}")"

}

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

spot pie*2016 #or
spot 2016*pie

无需*在查询之前或之后添加搜索模式,只需在查询的'*$1*'开头和结尾标记通配符即可。另外一个cd是不区分大小写的并且忽略变音符号,例如,fred将同时返回Frédéric和FrEDeric。

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


太棒了!
消沉

0

以/为根目录捕获磁盘上每个文件的列表

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

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

很好,
谢谢卡米尔
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.