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

96

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

我想查找我的硬盘上是否有其他地方也安装了*.jdk,于是我执行了搜索命令:

find . -name "*.jdk"

但是它什么都找不到,甚至我知道已经存在的那一个也没有。为什么会这样呢?

8个回答

167

find . 只会在当前目录下查找文件。如果你有权限在其他目录(如 root 权限)中查找文件,可以使用以下命令查找你要找的文件:

find / -type f -name "*.jdk"

如果你收到很多"permission denied"(权限被拒绝)的消息,你可以通过以下方式抑制它:

find / -type f -name "*.jdk" 2> /dev/null

7
@Prostak,这只会显示普通文件,而不包括目录。-type f是为了过滤掉符号链接、目录、设备等其他类型的文件。 - BRPocock
我将这个标记为正确答案。但是感谢你们两个的帮助! - Prostak
2> /dev/null 这部分是如何工作的? - Daniel Apt
@DanielApt 2> 将错误消息重定向到“其他地方”,而正常输出 (1>) 仍然会打印到终端。 - undefined

12

a/

find . 的意思是“在当前目录中查找”。如果你想搜索整个系统,请使用 find /;如果要在 /System/Library 下搜索,请使用 find /System/Library 等。

b/

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

    find . -name *.jdk

然而,如果您在运行时的当前目录中有文件junk.jdkfoo.jdkfind将会被以下命令启动:

    find . -name junk.jdk foo.jdk

…由于有两个文件,这会让它混淆并导致错误。如果你删除 foo.jdk 后再做完全相同的操作,你会得到

    find . -name junk.jdk

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

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

    find /System -name '*.jdk'

或者,你可以将*进行转义:

    find /System -name \*.jdk

6

可能你的JDK名称是大写的,或者在OS X系统上可用的find命令默认情况下不会使用-print选项,如果没有指定操作; 请尝试以下命令:

find . -iname "*.jdk" -print

(-iname类似于-name,但执行不区分大小写的匹配;-print表示让find打印出结果)

--- 编辑 ---

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


1
为什么你必须使用“-print”,默认不是吗? - giannis christofakis
1
@giannischristofakis:刚刚查看了POSIX标准,是默认设置;可能我明确写出来是因为我担心它是我习惯于的GNUism(例如,在GNU find中,您也可以省略“.”,而在BSD find中则需要)。 - Matteo Italia

4
您正在使用的'.'是当前目录。如果您从主目录开始,它可能会错过JDK文件。
最坏的情况是从根目录开始搜索。
 find / -name '*.jdk' -o -name '*.JDK' -print

否则,将“/”替换为您确定应该是JDK文件的父级的某个路径。
我希望这可以帮到你。

3
如果你在Mac终端上,并且已经处于你想要搜索的目录中,那么这个方法也适用于你:
find *.pdf

至少对我而言它起作用了。


2

在Mac上也可以使用“find / -type f -name“*.jdk””命令。


2

这对我在 macOS 上有效。

find . -type f -iname '*.jdk'

0

ls *.jpg | cut -f 1 -d "."

将“.jpg”替换为您想要列出的任何扩展名


如果文件在子目录中怎么办? - stdunbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接