Вам нужно разделить свои аргументы так же, как это сделала бы оболочка:
#include <unistd.h>
int main() {
char *args[10];
int i = 0;
args[i++] = "/usr/sbin/iptables";
args[i++] = "-I";
args[i++] = "INPUT";
args[i++] = "-p";
args[i++] = "tcp";
args[i++] = "--dport";
args[i++] = "80";
args[i++] = "-j";
args[i++] = "ACCEPT";
args[i++] = NULL;
execve(args[0], args, NULL);
}
Оболочка разбивается на все пространства.
find. -type d -exec sh -c '
f="$1"/file
[ -e "$f" ] && { printf "%s\n" "$f"; true; }
' find-sh {} \; -prune
Вместо поиска файлов я нахожу каталоги и проверяю наличие file
в каждом каталоге. Если file
существует, путь к нему печатается и -prune
активируется для каталога.
Примечания:
true
должен убедиться, что -prune
выполняет свою работу, даже если printf
не работает по какой-либо причине.
В этом решении find
никогда не обрабатывает никакие file
, он обрабатывает каталоги. Если вы хотите что-то сделать с file
, вы можете сделать это из внутренней оболочки, используя $f
.
Пример :Если бы я использовал … -prune -print
, инструмент напечатал бы соответствующий путь к каталогу, а не файл. Чтобы напечатать путь к file
, я использовал printf
из внутренней оболочки.