6

コマンドでファイルを見つけようとしますlocate

少なくとも likelsまたはfindコマンドではなく、パターンで奇妙な動作をします。

私は次のことを行います:

sh@sh:~$ locate rhythmdb
/home/sh/.local/share/rhythmbox/rhythmdb.xml
sh@sh:~$ locate "rhyth*"
sh@sh:~$ locate 'rhyth*'
sh@sh:~$ locate rhyth*

(スクリーンショット)

私の謙虚な意見では、アスタリスクが使用されている場合も検出する必要がありますが、検出されません。

何が間違っている可能性がありますか?

4

1 に答える 1

12

からman locate:

If  --regex is not specified, PATTERNs can contain globbing characters. If any
PATTERN contains no globbing characters, locate  behaves  as  if the pattern
were \*PATTERN*.

したがって、発行するとき

locate rhyth*

locateこのパターンに一致するファイルがないため、見つかりません: グロブ文字があるため、locate は実際に一致しようとします (正規表現で):^rhyth.*そして明らかにそのような一致はありません (完全なパスで)。

あなたの場合、次を試すことができます:

locate "/home/sh/.local/share/rhythmbox/rhyth*"

また

locate '/rhyth' # equivalent to locate '*/rhyth*'

しかし、それはあまり良くありませんね。

次に、 の最初のオプションを見てくださいman locate

   -b, --basename
          Match  only  the base name against the specified patterns.  This
          is the opposite of --wholename.

万歳!この線:

locate -b "rhyth*"

あなたが望むように動作するはずです:ベース名が一致するファイルを見つけます正規表現で):^rhyth.*

お役に立てれば。

編集。コメントに答えるには: folder 内のlocateすべてのjpgファイルが/home/sh/music/必要な場合は、次のようにします。

locate '/home/sh/music/*.jpg'

(いいえ-b、うまくいきません)。これにより、フォルダーとそのサブフォルダーにあるすべてのjpgファイルが表示されることに注意してください。大文字のJPG拡張子を持つもの見つけることができるように、フラグ (大文字と小文字を区別しない)を使用したくなるかもしれません。/home/sh/music -i

locate -i '/home/sh/music/*.jpg'

編集 2.どこかで言うと、このlocateコマンドはデータベースで動作しますfind。最近のファイルがある場合、それらはlocated にならず、一部のファイルを削除してもlocated のままである可​​能性があります。この場合(他のコメントの目的である可能性があります)、locateのデータベースを更新する必要があります:ルートとして、次を発行します:

updatedb

警告。コマンドupdatedbが完了するまでに数分かかる場合がありますが、心配しないでください。

于 2013-06-23T16:47:01.133 に答える