在Unix中查找具有特定扩展名的所有文件?

Pro*_*tak 52 unix macos terminal search

我有一个文件 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

我试图找到我的硬盘上的其他地方是否有*.jdk.所以我做了一个搜索命令:

find . -name "*.jdk"
Run Code Online (Sandbox Code Playgroud)

但它没有找到任何东西.甚至不是我认识的那个人.怎么会?

jay*_*ngh 103

find .只查看当前目录.如果您有权在其他目录中查找文件(root访问权限),那么您可以使用以下命令查找文件 -

find / -type f -name "*.jdk"
Run Code Online (Sandbox Code Playgroud)

如果您获得了大量权限被拒绝的消息,那么您可以通过执行来抑制这些消息

find / -type f -name "*.jdk" 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

  • @Prostak,这只会显示常规文件,而不是目录.`-type f`用于过滤掉符号链接,目录,设备等. (5认同)

BRP*_*ock 11

一个/

find .表示"查找(从当前目录开始)." 如果要搜索整个系统,请使用find /; 搜索/System/Library,使用find /System/Library

b /

在通配符周围使用单引号更安全.如果在运行此目录时工作目录中没有名为*.jdk的文件,那么find将得到一个命令行:

    find . -name *.jdk
Run Code Online (Sandbox Code Playgroud)

但是,如果您碰巧有文件,junk.jdk并且foo.jdk在运行它时在当前目录中,find则将改为:

    find . -name junk.jdk foo.jdk
Run Code Online (Sandbox Code Playgroud)

...(因为有两个)会混淆它,并导致它出错.如果你再删除foo.jdk并再次执行完全相同的操作,那么你就可以了

    find . -name junk.jdk
Run Code Online (Sandbox Code Playgroud)

......永远不会找到一个名为(例如)的文件1.6.0.jdk.

在这种情况下你可能想要的是,

    find /System -name '*.jdk'
Run Code Online (Sandbox Code Playgroud)

......或者,你可以"逃避" *:

    find /System -name \*.jdk
Run Code Online (Sandbox Code Playgroud)


Mat*_*lia 6

可能你的JDK是大写的和/或如果没有指定动作find,OS X上的可用版本不会默认-print; 尝试:

find . -iname "*.jdk" -print
Run Code Online (Sandbox Code Playgroud)

(-iname就像是-name执行不区分大小写的匹配; -printfind要打印出结果)

---编辑---

正如@Jaypal所指出的那样,显然find .......只查看当前目录(和子目录),如果要搜索整个驱动​​器,则必须指定/为搜索路径.