特定のアクセス拒否パスを無視しながら、すべてのログファイルを再帰的に見つける方法は?

特定のアクセス拒否パスを無視しながら、すべてのログファイルを再帰的に見つける方法は?

私はLinux Mint 18.3を使用しており、エラーメッセージなしでLinuxシステム上のすべてのログファイルを見つけるという学校の課題があります。コマンドを集めて徹底的に説明する必要があります。 findを使って方法を見つけたようですが、gvfsへのアクセス拒否メッセージがあり、どのように処理するのかわかりません。エラーメッセージを盲目的にフィルタリングするだけでなく、実際に言葉にならないメッセージだけを無視するシンプルでスマートなコマンドを書くのに役立ちますか?私の最初の試み:

# find / -type f -name '*.log'

すべてのログファイルが返されたように見えますが、結果は次のようになります。

find: '/run/user/1000/gvfs': Permission denied

その後、フォルダを省略してみました。

# find / -type d \( -name run \) -prune -o -type f -name '*.log' -print

ただし、実行フォルダ全体を無視するのは賢明ではないように見えるため、指定を開始して特定のパスにスコープを絞り込むこともできます。確立されたこれ投稿とunix.stackexchange.com/a/77592答えてこの特定のパスを省略しようとしました。

# find / -name '*.log' -path '/run/user/1000/gvfs' -prune -o -type f -name '*.log' -print

しかし、期待どおりに動作しないようです。すべてのログファイルの戻り値はまだ同じようです。

find: '/run/user/1000/gvfs': Permission denied

今、私は理解するのが難しいか、私の考えが間違っているか、最も簡単で賢明な方法であるこの特定のパスを無視しています。

答え1

ログファイルはに保存されるため、実際にはルートディレクトリ全体で実行する/var/log必要はありません。findこの作業に固執し、エラーを避けるためにディレクトリを除外するには、構文は次のようになります。

find / -wholename /run -prune -o -type f -name '*.log' -print

このディレクトリはFUSEのマウントポイントであり、ログファイルを含まず、/runそれ自体が許可エラーが発生するディレクトリ(少なくともCentos、Fedora、およびRHELでは)なので、上記のコマンドはそのディレクトリを完全に除外します。私はMintをインストールしていないので、エラーが発生するまで下を切り取るようにコマンドを編集できます。

また、留意すべき1つのことは、ログファイルが常に、、など.logで終わるわけではないということです。messagesdmesgcronsecure

答え2

ただし:

 find / -type f -name '*.log' 2>/dev/null

または

find /var -type f -name '*.log'

ログに関する限りvar

答え3

「許可拒否」エラーメッセージを防ぐための正しいイディオムは次のとおりです。

find <root-path> ! -readable -prune -o <rest of your find arguments>

これを元の課題の回答に適用すると、次のような結果が得られます。

find / ! -readable -prune -o -type f -name "*.log"

これは、「シンプルでスマートなコマンドの組み立て」の要件を満たす必要があります。また、読み取れないコンテンツのみをフィルタリングするため、「盲目的にエラーメッセージをフィルタリングしない」という要件を満たしています。 「しかし、実際に話すことはできません。スクリプトを実行する特定のシステム?どの環境変数があるかわかりません。

関連情報