Я предполагаю, из вашего описания, что вы делаете это (я разбил его на четыре строки, чтобы избежать горизонтального прокрутка)
>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.
Нет смысла указывать grep выполнять рекурсивный поиск ( -r
), потому что вы никогда не указываете каталог в качестве аргумента. find
уже рекурсивно нашел все файлы. Поэтому я удалил эту опцию из всех моих примеров.
cat tmp.txt | подробнее
- Бесполезное использование кошки (UUOC). Просто используйте еще tmp.txt
.
В Gnu find замените ;
на +
для большей эффективности (за исключением примера, который использует bash -c
).