查找没有目录的文件名

查找没有目录的文件名

如何使用 find 来查找没有前面的目录 (./) 的文件,并且同时使用 -exec 吗?

我的目标是通过 Apache 日志来查看最近是否有任何文件被访问过。这是我目前所得到的:

find . -max-depth 1 -type d \
  -exec grep \"GET /{}\" /var/log/apache2/blah.com \;

我找到了使用 -printf "%f\n" 的解决方案,但它不适用于 -exec。

答案1

find . -maxdepth 1 -type d -printf "%f\0" | \
     xargs -0 -I {} grep 'GET /{}' /var/log/apache2/blah.com

答案2

尝试:

grep -Ff <(find . -maxdepth 1 -type d | sed -e 's,^\.,GET ,') /var/log/apache2/blah.com

或者,如果您想在find命令中替换 {}:

find . -maxdepth 1 -type d -exec bash -c 'F={}; F=${F#./}; grep -F "GET /$F" /var/log/apache2/blah.com' \;

答案3

由于您没有进行递归搜索,因此无需使用find,除非您只想包含目录而不包含目录的符号链接。假设没有名称以点开头的目录(如果有,请使用for x in .*/ */; do …),以下将搜索当前目录中所有目录的名称和目录的符号链接:

for x in */; do grep -F "GET /${x%/}" /var/log/apache2/blah.com; done

如果您正在进行递归搜索,则可以通过从而*不是搜索来避免以点开头.(与上面关于以点开头的名称的评论相同)。

find * -type d -exec grep -F "GET /${x%/}" /var/log/apache2/blah.com

另一种可能性是对 的输出进行后处理find。这与 grep 搜索多个换行符分隔模式的功能结合使用时特别有用。

grep -F "$(find . -type d | sed -e 's!^\.!GET !')" /var/log/apache2/blah.com

请注意,在所有情况下,您都假设目录名称中没有任何字符会在 Apache 日志中被转义。只需对输出进行一些进一步的后处理即可解决此问题find

相关内容