grep -r
如果不起作用,如何在 BusyBox 1.0 上找到包含特定字符串的文件?
答え1
find
加grep
结合find
使用递归遍历目录grep
。
如果支持-print0
和-0
已编译,那么您可以使用一次xargs
调用多个文件:grep
find /some/dir -type f -print0 | xargs -0 grep -H PATTERN
如果您的文件名很温和(没有空格或\'"
),则不需要-print0
/ -0
:
find /some/dir -type f |xargs grep -H PATTERN
如果没有合适的xargs
,则需要grep
分别调用每个文件名:
find /some/dir -type f -exec grep -H PATTERN {} \;
如果你有find
但它没有-exec
,并且你的文件名很温和(没有换行符或\[*?
),并且你的 shell 支持命令替换(即 ash 而不是 hush),并且没有太多文件需要考虑,你可以生成文件名列表 并将find
其作为参数传递给grep
.
set -f
IFS='
'
grep PATTERN $(find /some/dir -type f)
set +f
如果有很多文件,您可以for
对所有文件使用循环(由于命令替换,仍然仅灰化)。
set -f
IFS='
'
for x in $(find /some/dir -type f); do
grep -H PATTERN "$x"
done
set +f
1 Busybox 上没有。-exec … +
没有find
如果没有find
,事情就会变得复杂。如果你的 Busybox 有 ash 和一个像样的test
,你可以在 shell 中编写递归目录遍历。
traverse () {
d=$1; shift
for x in "$d"/* "$d"/.[!.]* "$d"/..?*; do
if test -f "$x"; then
"$@" "$x"
elif test -d "$x"; then
traverse "$x" "$@"
fi
done
}
traverse /some/dir
但如果您没有find
,那么您可能使用的是一个非常有限的系统,其中 shell 很安静,缺乏功能。您可以使用 来模拟功能eval
。我假设你有test
;如果不这样做,检测目录是可能的,但很痛苦。
command='grep -H PATTERN'
traverse='
for x in "$d"/* "$d"/.[!.]* "$d"/..?*; do
if test -f "$x"; then
'"$command"' "$x"
elif test -d "$x"; then
d="$x"
eval "$traverse"
fi
done
'
d=/some/dir
eval "$traverse"