在 Unix 中查找所有具有特定扩展名的文件?
Posted
技术标签:
【中文标题】在 Unix 中查找所有具有特定扩展名的文件?【英文标题】:Finding all files with certain extension in Unix? 【发布时间】:2012-01-26 07:57:17 【问题描述】:我有一个文件/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
我正在尝试查找我的硬盘驱动器上是否有 *.jdk。所以我做了一个搜索命令:
find . -name "*.jdk"
但它什么也没找到。甚至没有我知道我拥有的那个。怎么会?
【问题讨论】:
【参考方案1】:find .
仅在您的当前目录中查找。如果您有权在其他目录中查找文件(root 访问权限),那么您可以使用以下命令查找您的文件 -
find / -type f -name "*.jdk"
如果您收到大量权限被拒绝消息,那么您可以通过这样做来抑制它
find / -type f -name "*.jdk" 2> /dev/null
【讨论】:
@Prostak,这只会显示常规文件,而不是目录。-type f
是过滤掉符号链接、目录、设备等。
我将此标记为正确答案。但是感谢你们俩的帮助!【参考方案2】:
一个/
find .
表示“查找(从当前目录开始)”。如果要搜索整个系统,请使用find /
;在/System/Library
下搜索,使用find /System/Library
等。
b/
在通配符周围使用单引号更安全。如果运行时工作目录中没有名为 *.jdk 的文件,则find
将获得以下命令行:
find . -name *.jdk
但是,如果您在运行时碰巧在 当前目录 中有文件 junk.jdk
和 foo.jdk
,find
将改为以:
find . -name junk.jdk foo.jdk
... 这会(因为有两个)混淆它,并导致它出错。如果您随后删除 foo.jdk
并再次执行完全相同的操作,您将拥有
find . -name junk.jdk
...它永远不会找到名为(例如)1.6.0.jdk
的文件。
在这种情况下你可能想要的是
find /System -name '*.jdk'
...或者,您可以将*
“转义”为:
find /System -name \*.jdk
【讨论】:
【参考方案3】:可能您的 JDK 是大写的和/或 OS X 上可用的 find
版本不默认为 -print
如果未指定任何操作;试试:
find . -iname "*.jdk" -print
(-iname
类似于 -name
,但执行不区分大小写的匹配;-print
对 find
说以打印结果)
--- 编辑 ---
正如@Jaypal 所指出的,显然find .
... 仅查看当前目录(和子目录),如果要搜索整个驱动器,则必须指定/
作为搜索路径。
【讨论】:
为什么一定要用-print
,不是默认的吗?
@giannischristofakis:刚刚检查了 POSIX 标准,是的,这是默认的;可能我明确写了它,因为我担心它是我习惯的 GNUism(例如,在 GNU 中,您也可以省略 .
,而 BSD 中的 IIRC 发现它是必需的)。【参考方案4】:
'.'您正在使用的是当前目录。如果您从主目录开始,它可能会丢失 JDK 文件。
最坏情况的搜索是从根目录开始
find / -name '*.jdk' -o -name '*.JDK' -print
否则,将“/”替换为您确定应该是 JDK 文件的父级的路径。
我希望这会有所帮助。
【讨论】:
【参考方案5】:find / -type f -name "*.jdk" 也适用于 Mac
【讨论】:
【参考方案6】:如果您在 Mac 终端上,并且已经在您想要进行搜索的目录中,那么这也可能适合您:
find *.pdf
至少它对我有用。
【讨论】:
【参考方案7】:ls *.jpg |剪切 -f 1 -d "."
将“.jpg”替换为您想要列出的任何扩展名
【讨论】:
如果文件在子目录中怎么办?【参考方案8】:这适用于我在 macOS 上。
find . -type f -iname '*.jdk'
【讨论】:
以上是关于在 Unix 中查找所有具有特定扩展名的文件?的主要内容,如果未能解决你的问题,请参考以下文章