「検索」出力でシンボリックリンクではなくファイル数を計算する

「検索」出力でシンボリックリンクではなくファイル数を計算する

Locateコマンドで渡された非シンボリックファイルの数を数えようとしています。私はいくつかのオプションを試しましたが、これが最も有望だと思います。

locate -r "$PWD.*\.c$" | xargs -0 -I{} test -f {} && echo "regular file" | wc -l

問題はそれがうまくいかないことです。

合計30個のファイルがあり、そのうちの1つはシンボリックリンクwc -lなので29

私はxargsそれを完全にスキップしようとしました。

locate -r "$PWD.*\.c$" | test -f && echo "regular file" | wc -l

頑張ったいいえシンボリックリンク:

locate -r "$PWD.*\.c$" | test ! -h && echo "regular file" | wc -l
locate -r "$PWD.*\.c$" | test ! -L && echo "regular file" | wc -l

locate出力をパイプし、通常のファイル数とシンボリックリンク数を計算する最も効率的な方法は何ですか?


コメントに返信する

一部の人々は演出が好きですlocatefind不可知論者であればいいのですが、できればlocate使いたいです。コメントが投稿されており、質問に回答したいと思います。

  • updatedb最初の実行には30秒かかりますが、後続の実行には4秒しかかかりません。 5分ごとに走るのは、1cron日1回というデフォルト値に対する無謀な反応です。しかし、ノートパソコンのCPU使用量は10~20%に過ぎず、レックもまったくありません。
  • キャッシュを削除した後、ファイルをfind探すのに1分9秒かかります。
  • キャッシュを削除した後、locate同じファイルを見つけるのに1秒かかります。

以下は、システムに複製できるいくつかのベンチマークです。

$ sudo -i
# sync; echo 1 > /proc/sys/vm/drop_caches; sync; echo 2 > /proc/sys/vm/drop_caches; sync; echo 3 > /proc/sys/vm/drop_caches; exit
logout

$ time locate .hidden.c | wc -l
1

real    0m0.790s
user    0m0.758s
sys     0m0.028s

$ sudo -i
# sync; echo 1 > /proc/sys/vm/drop_caches; sync; echo 2 > /proc/sys/vm/drop_caches; sync; echo 3 > /proc/sys/vm/drop_caches; exit
logout

$ time find / iname '.hidden.c'  2>/dev/null | wc -l
1888926

real    1m9.044s
user    0m5.158s
sys     0m15.004s

$ sudo -i
# sync; echo 1 > /proc/sys/vm/drop_caches; sync; echo 2 > /proc/sys/vm/drop_caches; sync; echo 3 > /proc/sys/vm/drop_caches; exit
logout

$ time sudo updatedb

real    0m29.323s
user    0m1.267s
sys     0m4.784s

$ time sudo updatedb

real    0m3.592s
user    0m0.479s
sys     0m1.211s

find間違いなくそれよりも強力ですlocateが、locate数倍速く、構文も覚えやすくなります。

実際に、今日生成されたファイルを含めるか、今日削除されたファイルを除外するようにデータベースを更新するには、コマンドの引数を一度sudo updatedbに実行または渡す必要があることに注意してください。しかし、一方でパラメータを渡すことを覚えておく必要があります。-ulocatefind2>/dev/null

まず、私のラップトップは正しく動作せず、2番目に怠惰なので、5分ごとにcron実行することにしました。updatedb

ベストアンサー1

このコマンドは閉じます。

locate -r "$PWD.*\.c$" | xargs -0 -I{} test -f {} && echo "regular file" | wc -l

質問:

  • xargsと一緒にNULLで区切られた入力を使用しますが、locateNULLで区切られた出力は提供しません。
  • 単一のパイプラインではなく、パイプライン全体に対して実行され&& echoます。locate | xargstest

努力する:

locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test -f "$1" && echo "regular file"' _  {} | wc -l
  • locate以下を使用して、Nullで区切られた出力を有効にします。-0
  • testandと結合(各呼び出しが複数のファイルを処理するようにechoパラメータループで改善することができます)sh -csh

にはまだ正規表現演算子があります$PWD

おすすめ記事