web-dev-qa-db-ja.com

ロケート検索でディレクトリを除外する

locateを使用して検索すると、ファイルシステム内のパスが見つかります。
多くの場合、ファイルのみ、またはディレクトリのみのいずれかに関心があるアプリオリを知っています。
「検索」検索は多くの結果を返すことがよくあります。出力を短くするのに役立つため、結果にタイプを1つだけ含めると便利です。

しかし、ファイルまたはディレクトリのいずれかを除外するためのより興味深い議論があります。結果パスのリストがあいまいになる可能性があるためです-理論上だけではありません。

以下の例は実際のケースであり、珍しいことではありません:

$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay

わかりました、何かを見つけました!しかし...ファイル、またはディレクトリ?

$ file /usr/local/bin/xfce4-keyboard-overlay 
/usr/local/bin/xfce4-keyboard-overlay:   bash script

これがファイルです...

$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory

一方、2番目は違います。

このあいまいさにより、パスの長いリストが読みにくくなるので、たとえば、locateのコマンドラインオプションを使用して、ディレクトリをフィルターで除外すると非常に便利です。

このようなものは存在しますか?ディレクトリのフィルターがロケートとは別であっても?

少なくとも、スクリプトを使用してすべてのファイル名を繰り返し確認することはできますが、これには時間がかかる場合があります。

14
Volker Siegel

zshの場合:

print -rl ${(0)^"$(locate -0 ...)"}(N.)

(0)は、NUL文字(locate -0を使用するため)で分割されるパラメーター拡張フラグであり、(ps:\0:)の短縮形です。

^では、配列の最後に(N.)を追加する代わりに、各要素に追加します。

(N.)はグロブ修飾子、.は通常のファイルのみと一致する、Nは一致しない(存在しないか通常のファイルではない)要素を削除する、または確認できません)。また、^/の代わりに.を使用して、通常のファイルだけではなく、ディレクトリ以外を照合することもできます。

print -rlは、各引数rawを個別のlineに出力します。

任意のzshグロブ修飾子を使用できますが、ここではファイルごとに1つのグロブを展開しているため、ordering onesは効果がないことに注意してください。それぞれを並べ替えます。

locateによって報告された最後のファイルが改行文字で終了すると失敗する可能性があることに注意してください(すべてのシェルに存在するコマンド置換の誤機能))。

3