Сортировка каталогов путем поиска определенного расширения файла

Возможно, вам потребуется установить пакет разработки 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
1
20.07.2018, 19:11
2 ответа

Согласно сообщению найти файл с помощью определенного поиска в цикле 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")

1
27.01.2020, 23:23

Предположим, что структура каталогов подобна следующей:

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является текущим рабочим каталогом, но вы сказали, что это имело место в вопросе, поэтому это не должно быть проблемой.

2
27.01.2020, 23:23

Теги

Похожие вопросы