Возможно, вам потребуется установить пакет разработки libkrb5-dev
или krb5-multidev
:
apt-get install libkrb5-dev
и требуются правильные параметры для gcc
(запустите krb5-config.mit gssrpc --libs
, чтобы получить их):
gcc test.c -o test $(krb5-config.mit gssrpc --libs)
, который расширяется до (в зависимости от системы):
gcc test.c -o test -L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,-z,relro -lgssrpc -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err
Согласно сообщению найти файл с помощью определенного поиска в цикле while одно из решений может быть следующим, используя цикл while
:
#!/bin/bash
while IFS= read -r d;
grep -q "index123" "$d" && dirname "$d"|awk -F'/' '{print $2}'
done < <(find. -maxdepth 2 -type f -name "*.out")
Предположим, что структура каталогов подобна следующей:
A
|-- B
| |-- file1.out
| |-- file2.out
| `-- file3.out
|-- C
| |-- file1.out
| |-- file2.out
| `-- file3.out
|-- D
| |-- file1.out
| |-- file2.out
| `-- file3.out
`-- E
|-- file1.out
|-- file2.out
`-- file3.out
Проблема с вашим кодом заключается в том, что ваш grep
будет выдавать результат, похожий на
./B/file1.out:2:some data which includes the word index123
./B/file2.out:2:some data which includes the word index123
./B/file3.out:2:some data which includes the word index123
./C/file1.out:2:some data which includes the word index123
./C/file2.out:2:some data which includes the word index123
./C/file3.out:2:some data which includes the word index123
./D/file1.out:2:some data which includes the word index123
./D/file2.out:2:some data which includes the word index123
./D/file3.out:2:some data which includes the word index123
./E/file1.out:2:some data which includes the word index123
./E/file2.out:2:some data which includes the word index123
./E/file3.out:2:some data which includes the word index123
Это вывод
grep --include=\*.out -rnw. -e "index123"
с A
в качестве текущего каталога.
Затем вы попытаетесь выполнить basename
для этих отдельных строк, что не удастся, поскольку basename
принимает не более двух аргументов, (имя пути и суффикс, который необходимо удалить из этого имени пути ). GNU basename
будет жаловаться на «дополнительный операнд», тогда как BSD basename
будет жаловаться на неправильное использование.
grep
покажет вам только имена файлов (, т. е. не полную строку, совпадающую с ), если вы используете ее с флагом -l
.
Это означает, что ваш скрипт может быть заменен одной командой
grep -w -l "index123" */*.out
Это даст результат в форме
B/file1.out
B/file2.out
B/file3.out
C/file1.out
C/file2.out
C/file3.out
D/file1.out
D/file2.out
D/file3.out
E/file1.out
E/file2.out
E/file3.out
Я добавил -w
, как вы использовали в командной строке grep
.-n
(для нумерации строк, которые вы также используете ), нельзя использовать вместе с -l
.
Судя по вашему коду, это то, что вам нужно.
Если вам нужны только имена папок, сделайте
$ grep -w -l "index123" */*.out | sed 's#/[^/]*##' | sort -u
B
C
D
E
Все это предполагает, что A
является текущим рабочим каталогом, но вы сказали, что это имело место в вопросе, поэтому это не должно быть проблемой.