首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索任意文件,但只在结果中列出匹配一次

搜索任意文件,但只在结果中列出匹配一次
EN

Unix & Linux用户
提问于 2019-11-29 08:29:06
回答 3查看 164关注 0票数 3

我想搜索任意文件/目录名,但只想列出包含搜索字符串的文件路径一次。特别是不是目录中的每个文件都匹配搜索字符串。

下面是一个例子,locate -i flatpak列表:

代码语言:javascript
复制
/etc/flatpak
/etc/dbus-1/system.d/org.freedesktop.Flatpak.SystemHelper.conf
/etc/flatpak/remotes.d
/etc/profile.d/flatpak.sh
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/74
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/75
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/76
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/77
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/78
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/79
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/7a
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/7b
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/7c
/home/simon/.cache/gnome-software/flatpak/installation-tmp/repo/objects/7d
/var/lib/flatpak
/var/lib/flatpak/.changed
/var/lib/flatpak/.removed
/var/lib/flatpak/app
/var/lib/flatpak/appstream
/var/lib/flatpak/exports
/var/lib/flatpak/repo
/var/lib/flatpak/runtime

但我想要这样的搜索结果:

代码语言:javascript
复制
/etc/flatpak
/etc/dbus-1/system.d/org.freedesktop.Flatpak.SystemHelper.conf
/etc/profile.d/flatpak.sh
/home/simon/.cache/gnome-software/flatpak
/var/lib/flatpak

哪种工具最适合这个?locatefindfd-find

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2019-11-29 09:56:27

听起来您只想在文件名(而不是在其他路径组件中)中搜索flatpak,因此可以使用-b/--basename选项:

所以:

代码语言:javascript
复制
locate -ib flatpak

另一种方法可以是使用-r/--regex选项并编写:

代码语言:javascript
复制
locate -ir 'flapak[^/]*即flatpak,后面跟着除/之外的任意数量的字符,然后是文件路径的末尾。不过,这可能会遗漏在flatpak之后具有非字符(在当前区域设置中)的文件名。

flatpak,后面跟着除/之外的任意数量的字符,然后是文件路径的末尾。

不过,这可能会遗漏在flatpak之后具有非字符(在当前区域设置中)的文件名。

票数 3
EN

Unix & Linux用户

发布于 2019-11-29 09:15:30

您可以使用sed删除模式flatpak之后的所有内容,然后对输出进行排序,只打印唯一的行:

代码语言:javascript
复制
locate -i flatpak | sed -E -e 's/(flatpak\/?).*/\1/i' -e 's/\/$//' | sort | uniq
票数 3
EN

Unix & Linux用户

发布于 2019-11-29 10:26:58

要使用find查看整个文件系统中包含字符串flatpack的文件名,请执行以下操作:

代码语言:javascript
复制
find / -name '*flatpack*'

如果您的find实现有-iname,那么您可以使用它代替-name来不敏感地搜索案例。如果您只想搜索常规文件,那么也要使用-type f (您的示例涉及到查找任何类型的文件,因此您可能应该忽略这一点):

代码语言:javascript
复制
find / -type f -iname '*flatpack*'

find试图进入您无法访问的目录时,这可能会给您提供一些“拒绝权限”错误。为了避免这种情况,您可能会使用GNU find,如下所示:

代码语言:javascript
复制
find / ! -readable -prune -o -iname '*flatpack*' -print

这比使用locate -ib flatpack要慢,但是总是会给出最新的结果。locate正在使用的数据是每天或每周收集的,不包括所有用户都无法读取的路径。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/554750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档