すべてのファイルを検索しますが、結果に一度だけ一致するもののみを一覧表示します。

すべてのファイルを検索しますが、結果に一度だけ一致するもののみを一覧表示します。

任意のファイル/ディレクトリ名を検索したいが、同じ場所に検索文字列を含むファイルパスのみをリストしたいと思います。特に、ディレクトリ内のすべてのファイルが検索文字列と一致するわけではありません。

以下は例の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

この目的に最適なツールは何ですか?locatefindfd-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実装に1つがある場合は、大文字と小文字を区別せずに検索する-iname代わりにそれを使用できます-name。通常のファイルのみを検索したい場合にも機能します-type f(あなたの例には次のものが含まれます)。どのファイル形式なので無視する必要があります):

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

findこれにより、アクセス権のないディレクトリに入ろうとすると、「権限の拒否」エラーが発生する可能性があります。これを防ぐには、find次のようにGNUを使用できます。

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

を使用するよりも速度は遅いですが、locate -ib flatpack常に最新の結果を提供します。使用中のデータはlocate毎日または毎週収集され、すべてのユーザーが読めないパスは含まれません。

関連情報