検索を使用するよりも特定のファイルを見つけるより高速な方法はありますか?

検索を使用するよりも特定のファイルを見つけるより高速な方法はありますか?

特定の権限(755)を持たないフォルダ内のファイルを見つける必要があります。このサブディレクトリには、合計数百万のファイルを含む他のサブディレクトリがあり、find ./ -not -perm 755コマンドが長すぎます。

これを行うには、より効率的で高速なコマンドがあります(たとえば、lsとgrepなどの組み合わせ)。

ベストアンサー1

使用する場合は、ls -lR何らかの方法で出力から項目を除いて必要なものをgrep出力する必要があります。

findおそらくより速いでしょう。ここに私のコンピュータのための非常に速いハッキングがあります(彼らはgrep醜くて誇りに思っていません)。

tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.247s
user    0m1.456s
sys     0m1.808s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.503s
user    0m0.120s
sys     0m0.380s
tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.128s
user    0m1.564s
sys     0m1.920s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.501s
user    0m0.196s
sys     0m0.428s

いくつかの注意:

  • キャッシュの違いの可能性を排除するために、これら2つのコマンドを2回実行しました。
  • 彼らは別の数を返すことがわかります。私のクイックハックgrepは、関連ファイルとディレクトリエントリだけを分離するのに十分ではありませんでした。
  • これの目的は、より良い解決策を示すことではなく、findraw +と比較してかなり高速であることを示すことです。lsgrep

perlたとえば、より速い解決策やより速い実行を可能にする方法がありますls(設定$LANG? - 私のテストでは、この結果は2番目に少ない出力として表示されますlsls

編集:ちょうどあなたのコメントを見て、権限を変更する必要があると言いました。この場合、findすべてを一度に行うので、確かに正解です。

find ./ -not -perm 755 -exec chmod 755 {} \;

あなたはする必要がありますとても慎重ですこのコマンドを実行するときは、正しい場所にあることを確認してください。より安全なオプションは、

find /actual/full/path -not -perm 755 -exec chmod 755 {} \;

したがって、間違った場所にいると、システム上のすべてのファイルが変更されるのを防ぐことができます。

また、ソフトリンク、ディレクトリ、および非正規ファイルも考慮し、findそれに応じてファイルを変更する必要があります。したがって、ファイルにのみ興味があると仮定すると、次から始めます。

find /actual/full/path -type f -not -perm 755 -exec chmod 755 {} \;

最後に、ディレクトリまたはディレクトリグループ内のすべてのファイルに対する権限を755から755に変更するかどうかを諮問することで、複雑な作業を行う必要はありません。

find /actual/full/path -type f -exec chmod 755 {} \;

これはすべて755に設定されます。少し速くすることができます(更新するファイルを選択するロジックと、数百万のファイルの権限を更新するロジックが少なくなります。これは、正しいファイル数によって異なります)。

おすすめ記事