(遅い)Linuxの「find」コマンドには、「ls -l」コマンドと同様に、サイズ、日付などを表示するための「-ls」オプションがあります。しかし、「locate」コマンドにはそれがないようです。では、ロケートで同等の機能を取得するにはどうすればよいですか?
次のように、バックティックを使用して、locateの出力をlsに渡しました。
ls -al `locate -e somefile`
…somefileが存在する限り動作します。しかし、ファイルが存在しない場合は、完全なディレクトリリストが表示されます。
私がこれをすると:
ls -al `locate -e somefile` thisfileneverexists
...エラー行を気にしないのであれば、それは一種の働きです:
ls: cannot access thisfileneverexists: No such file or directory
…これにより、明らかではあるが非常に醜い回避策につながります。
ls -al `locate -e somefile` thisfileneverexists 2>/dev/nul
それはうまくいきますが、確かにもっと良い方法があります!
xargs
を使用します。これは一連のパラメーターを入力として受け取り、それらに対して操作を実行します。
locate -eb0P somefile | xargs -r0 ls -ald
xargsは、ロケートの結果をパラメーターとして使用してls -ald
コマンドを実行します。
-e
スイッチは、データベースで見つかったファイルが実際に存在することを確認し、存在しないファイルは無視するようにLocateに指示します。
-b
スイッチは、ベース名だけに一致するようにLocateに指示します。
-0
(ゼロ)スイッチは、空白の代わりにnull区切り文字を生成するようにLocateに指示します(そのため、空白を含むファイル名を処理できます)
-P
スイッチは、壊れたシンボリックリンクをリストするようにLocateに指示します
-r
スイッチは、何も渡されない場合(つまり、locateが何も返さない場合)にコマンドを実行しないようにxargsに指示します。
-0
スイッチは、xargsに区切り文字として空白ではなくnullを期待するように指示します
-a
スイッチは、「。」で始まるファイルもリストするようにlsに指示します。
-d
スイッチは、lsに内容ではなくディレクトリをリストするように指示します
locate
の結果を変数に格納し、値があるかどうかを確認してから、それを表示します。
f=`locate ...`
[ "$f" ] && ls -al "$f"
この情報をlocate
から直接取得できないのは、locate
が使用するデータベースにないためです。
locate
出力をループすることもできます。
locate somefile | while IFS= read -r i; do ls -la "$i"; done