如何在 BusyBox 1.0 上递归地 grep 文本?

如何在 BusyBox 1.0 上递归地 grep 文本?

grep -r如果不起作用,如何在 BusyBox 1.0 上找到包含特定字符串的文件?

ベストアンサー1

findgrep

结合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"

おすすめ記事