Предположим, что структура каталогов подобна следующей:
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
является текущим рабочим каталогом, но вы сказали, что это имело место в вопросе, поэтому это не должно быть проблемой.
Вы используете строгий учет перерасхода , поэтому процессам не разрешено отображать больше доступной памяти. Строка Committed_AS
показывает, что в настоящее время выделено 9543584 КБ, а строка CommitLimit
показывает, что ограничение составляет 16760020 КБ, остается 7216436 КБ, которые могут быть выделены; это 59,6% вашей доступной памяти, поэтому, принимая во внимание некоторые накладные расходы для stress-ng
, неудивительно, что вы не можете выделить более 55% доступной памяти для vm worker.
Если вы хотите разрешить stress-ng
выделять больше доступной памяти, вам нужно разрешить чрезмерную выделение:
sudo sysctl vm.overcommit_memory=0
или увеличьте сумму свопа, чтобы увеличить лимит фиксации.