我想搜索任意文件/目录名称,但只想在同一位置列出包含搜索字符串的文件路径一次。特别是不是目录中的每个文件都与搜索字符串匹配。
这是一个示例,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
?
您可以使用
sed
删除 pattern 之后的所有内容flatpak
,然后您可以对输出进行排序并仅打印唯一的行:听起来您只想
flatpak
在文件名中搜索(而不是在其他路径组件中),因此您可以使用-b
/--basename
选项:所以:
另一种方法可能是使用
-r
/--regex
选项并编写:除了文件路径的结尾之外,
flatpak
后面还有任意数量的字符。/
但是,这可能会错过 . 之后具有非字符(在当前语言环境中)的文件名
flatpak
。要使用
find
在整个文件系统中查找名称中包含字符串的文件flatpack
名:如果您的
find
实现有-iname
,那么您可以使用它来代替-name
不区分大小写的搜索。如果您只想搜索常规文件,那么也可以使用-type f
(您的示例涉及查找任何类型的文件,因此您可能应该将其省略):find
当您试图进入您无权访问的目录时,这可能会给您一些“权限被拒绝”错误。为避免这种情况,您可能会find
像这样使用 GNU:这会比 using 慢
locate -ib flatpack
,但总是会给你最新的结果。正在使用的数据locate
每天或每周收集一次,不包括并非所有用户都可读的路径。