Почему logrotate не вращается автоматически?

Я предполагаю, из вашего описания, что вы делаете это (я разбил его на четыре строки, чтобы избежать горизонтального прокрутка)

>tmp.txt;
find . -type f -name "*.pb*" \
     -exec grep -Hn pattern "{}" ";" >>tmp.txt;
cat tmp.txt | more

Если вы используете Gnu find, вы можете использовать -execdir вместо -exec ; это вызовет выполнение команды grep из каталога целевого файла, в результате чего имя файла будет относиться к каталогу, в котором оно находится. (например, ./ filename.ext ). Это не совсем то, что вы просите, но довольно близко, и есть другие веские причины использовать -execdir .

     -execdir grep -Hn pattern "{}" ";"      # See note 1

Другой вариант - использовать промежуточную оболочку для редактирования метки имени файла. Для этого требуется Gnu grep для параметра - label :

     -exec bash -c 'grep -Hn --label="$(basename "$1")" pattern "$1"' \
           _ "{}" ";"

Это немного дольше и намного больше работы для ОС, но устраняет ./ .

Для второго варианта вы можете передать весь вывод через sed , вставив новую строку после первой (или второй) : в каждой строке.

find . -type f -name "*.pb*" \
     -exec grep -Hn pattern "{}" ";" |
sed 's/:/&\n/' >>tmp.txt.

или (второе двоеточие):

find . -type f -name "*.pb*" \
     -exec grep -Hn pattern "{}" ";" |
sed 's/:[^:]*:/&\n/' >>tmp.txt.

Примечания

  1. Нет смысла указывать grep выполнять рекурсивный поиск ( -r ), потому что вы никогда не указываете каталог в качестве аргумента. find уже рекурсивно нашел все файлы. Поэтому я удалил эту опцию из всех моих примеров.

  2. cat tmp.txt | подробнее - Бесполезное использование кошки (UUOC). Просто используйте еще tmp.txt .

  3. В Gnu find замените ; на + для большей эффективности (за исключением примера, который использует bash -c ).

1
26.11.2017, 20:56
0 ответов

Теги

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