Команда выполняется в каждом каталоге, который содержит подобранный файл. С тех пор c
не содержит каталог, он не соответствует и таким образом не будет выполнен туда.
Решение состоит в том, чтобы добавить имя каталога к execdir аргументу, как так:
find . -type d -execdir touch {}/foo \;
, вам, вероятно, следует просто использовать fmt
или fold
или pr
или одну из них. Вот fmt
:
until [ $((i=i+1)) -gt 10000 ]
do printf %s\ words and more words
done | fmt
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
words words and more words words and more words words and more words
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
#...and so on for a long time
grep
буфер обязательно уступит место при любой серьезной нагрузке, если только он не сможет сбросить его на границу новой строки.
Например:
time (
tr \\0 \\n < /dev/zero |
sed 'c words and words and words and words and words and' |
tr -d \\n |
grep -o words
)
grep: memory exhausted
49.42s user 44.93s system 229% cpu 41.070 total
Это занимает некоторое время - но на этой системе много пустой оперативной памяти, и все же она умудрилась сломаться меньше чем за минуту.
Так что просто:
fmt <file | grep search
Более надежно, если в файле есть какой-то надежный односимвольный разделитель строк:
tr ${delim} \\n <file | grep search
grep определенно работает на основе строки, как и собака. Это не обязательно ускорит поиск, но вывод для совпадающей строки должен быть более быстрым.
.