我想搜索任意文件/目录名称,但只想在同一位置列出一次包含搜索字符串的文件路径。特别是不是目录中的每个文件都与搜索字符串匹配。
这是一个例子,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
是每天或每周收集的,并且不包括所有用户都无法读取的路径。