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

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

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

这是一个例子,locate -i flatpak列出:

/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

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

/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

哪种工具最适合此目的?locate, find, fd-find?

答案1

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

所以:

locate -ib flatpak

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

locate -ir 'flapak[^/]*$'

其后可flatpak跟任意数量的字符,但/文件路径末尾除外。

然而,这可能会错过flatpak.

答案2

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

locate -i flatpak | sed -E -e 's/(flatpak\/?).*/\1/i' -e 's/\/$//' | sort | uniq

答案3

用于find在整个文件系统中查找名称flatpack中包含该字符串的文件名:

find / -name '*flatpack*'

如果您的find实现有-iname,那么您可以使用它来代替-name不区分大小写地搜索。如果您只想搜索常规文件,那么也可以使用-type f(您的示例涉及查找任何文件类型,所以你应该忽略它):

find / -type f -iname '*flatpack*'

find当您尝试进入您无权访问的目录时,这可能会给您带来许多“权限被拒绝”错误。为了避免这种情况,您可以find像这样使用 GNU:

find / ! -readable -prune -o -iname '*flatpack*' -print

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

相关内容