如何使用 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
。