find . -name '*.py' -exec grep something {} \; -print
выведет имя файла после совпадающих строк.
find . -name '*.py' -exec grep something /dev/null {} +
выводит имя файла перед каждой совпадающей строкой (мы добавляем
/dev/null
для случая, когда есть только один совпадающий файл, посколькуgrep
не выводит имя файла, если ему передан только один файл для поиска. В GNU-реализацииgrep
есть опция-H
для этого в качестве альтернативы).find . -name '*.py' -exec grep -l something {} +
выведет только имена файлов, в которых есть хотя бы одна совпадающая строка.
Чтобы вывести имя файла перед совпадающими строками, можно использовать awk:
find . -name '*.py' -exec awk ' FNR == 1 {filename_printed = 0} /something/ { if (!filename_printed) { print FILENAME filename_printed = 1 } print }' {} +
Или вызвать
grep
дважды для каждого файла - хотя это будет менее эффективно, поскольку для каждого файла будет выполняться как минимум одна командаgrep
и до двух (и дважды считываться содержимое файла):find . -name '*.py' -exec grep -l something {} \; \ -exec grep something {} \;
В любом случае, вы не хотите циклически просматривать вывод
find
подобным образом и не забывайте заключать свои переменные в кавычки.Если вы хотите использовать shell-цикл, средствами GNU:
find . -name '*.py' -exec grep -l --null something {} + | xargs -r0 sh -c ' for file do printf "%s\n" "$file" grep something < "$file" done' sh
(также работает на FreeBSD и производных).
У вас есть 2 разные проблемы
Проблема в том, что APT использует _apt в качестве нашего непривилегированного пользователя. На Android с параноидальной сетью только пользователи из группы 3003 aid_inet или 3004 aid_inet_raw могут открывать сетевые сокеты. При установке apt создает пользователя _apt.
# add unprivileged user for the apt methods
adduser --force-badname --system --home /nonexistent \
--no-create-home --quiet _apt || true
Пользователь выглядит так в / etc / passwd
root@localhost:~
# grep -E "_apt" /etc/passwd
_apt:x:103:65534::/nonexistent:/bin/false
Формат passwd:
Имя пользователя: Зашифрованный пароль: Идентификационный номер пользователя (UID): Идентификационный номер группы пользователей (GID): Полное имя пользователя (GECOS ): Домашний каталог пользователя: Оболочка входа
, смотрящая на пользователя _apt, GID установлен на 65534, что означает отсутствие группы, в обычных системах Linux это нормально.На Android этот GID никогда не сможет устанавливать сетевые подключения Необходимо изменить GID на 3003
# usermod -g 3003 _apt
изменит GID
root@localhost:~
# grep -E "_apt" /etc/passwd
_apt:x:103:3003::/nonexistent:/bin/false
Теперь APT будет работать на Android chroot
Я заметил, что когда я chroot использовал этот пример команды
# chroot / linux / bin / bash -l
В Android группы используются для приложений, в некоторой степени. Итак, root, вызывающий bash, находится только в корневой группе , вы можете проверить это по
# groups
root
группам, запущенным без имени пользователя, выводам текущих групп процессов
Теперь попробуйте это
# su - root
su command is switch user
# groups
root sdcard-rw aid_bt aid_bt-net aid_inet aid_net-raw aid_net_admin
Теперь ping будет работать
Теперь я использую
# chroot / linux / bin / su - root
, который входит в систему как root из Linux, а не как root из Android
{ {1}}