it-swarm-ja.com

Linuxの「locate」コマンドからファイルの詳細(サイズ、日付など)を表示する方法は?

(遅い)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

それはうまくいきますが、確かにもっと良い方法があります!

7
Dave Burton

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に内容ではなくディレクトリをリストするように指示します

12
Paul

locateの結果を変数に格納し、値があるかどうかを確認してから、それを表示します。

f=`locate ...`
[ "$f" ] && ls -al "$f"

この情報をlocateから直接取得できないのは、locateが使用するデータベースにないためです。

locate出力をループすることもできます。

locate somefile | while IFS= read -r i; do ls -la "$i"; done
0
terdon