如何递归地查找所有日志文件,同时忽略一个特定的访问被拒绝路径?

如何递归地查找所有日志文件,同时忽略一个特定的访问被拒绝路径?

我正在使用 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,因此您可以编辑命令以修剪得更低,直到收到错误为止。

另外,需要记住的一件事是日志文件并不总是.logmessagesdmesgcron和等结尾secure

答案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"

这应该满足您“组装一个简单而智能的命令”的要求。它还满足“不只是盲目地过滤掉任何错误消息”的要求,因为它只过滤掉不可读的内容。你的最终要求“但只留下那些确实没有意义的地方”完全是另一回事,并且会提出一个很好的单独问题,即“有没有办法让脚本找到默认的系统日志根目录” ,在运行脚本的特定系统上?我不知道有什么环境变量。

相关内容