Обратите внимание, что
-a
, если он указан неявно (для например, два теста появляются без явного оператора между ними) или явно имеет более высокий приоритет, чем-o
. Это означает, чтонаходят. -name файл -o -name bfile -print
никогда не будет печататьфайл
.
Таким образом, вы можете представить найти
, заключив любые два "заключенных" выражения в круглые скобки по умолчанию. Ваш
find . -type f -name apple\* -o -name orange\*
интерпретируется как
find . \( -type f -name apple\* \) -o -name orange\*
Заставьте grep
выполнить работу strings
. Если у вас есть GNU grep, передайте опцию -z
, чтобы заставить его читать записи, разделенные нулями, вместо записей, разделенных новыми строками. Это также приведет к совпадению в конце файла, но на практике все должно быть нормально.
find . -maxdepth 1 -type f -size +1M -print0 |
xargs -0 grep -Eoz '[[:print:]]{3,}$'
Если у вас нет утилит GNU, передайте файл через tr
, чтобы поменять местами нулевые байты с новыми строками. Пока вы этим занимаетесь, сделайте tr
отбрасывающим непечатаемые символы.
find . -type d -prune -o -type f -size +1024k -exec sh -c '
for x; do
<"$x" tr \\0\\n \\n\\0 | tr -dsC "[:print:]" \\n |
grep ...
done
' _ {} +