LINUX.ORG.RU

Подсветка вывода скрипта

 , , , ,


0

1

Имеется скрипт, который находит в каталоге catalog1 текстовые файлы содержащие, например, «слово» и заменяет их на такие же, но без текста «слово», копируя их из catalog2.
catalog2 - это резервная копия catalog1, сделанная rsync-ом.

#!/bin/bash
var1=`grep -rl "слово" ~/catalog1 | sed 's|.*/||'`
zenity --info --title="Сообщение" --text="Будут заменены:\n$var1" --width=350
if [ "$?" -eq 1 ]; then
    zenity --info --title="Сообщение" --text="Действие отменено" --width=350
    else
    find ~/catalog1/ -type f -exec grep -rl "слово" {} \; -exec rm -v {} +
    sleep 1 
    echo -e '\033[37m' "Запускаем rsync" '\033[38;5;223m'
    sleep 1 
rsync -r -t -v --ignore-existing -u -s ~/catalog2/ ~/catalog1/
fi

Скрипт выполняется в терминале и я пытаюсь сделать подсветку вывода.
Есть сложности с find и rm. Вот здесь разбирается похожий вопрос и я воспользовался советами оттуда. Например, предлагается использовать GREP_COLORS
Делаю вот так:

find ~/catalog1/ -type f -exec grep -rl "слово" {} \; -exec rm -v {} + | GREP_COLORS="sl=1;31:ms=1;31" grep --color=always '^\|[^/]*$'

В этом случае раскрашиваются и rm и find - скриншот, но хотелось чтобы, только rm, а выхлоп find выводился цветом по умолчанию.
Перепробовал кучу вариантов, но не осилил эту тему.
Как можно здесь выкрутиться, раскрасив только вывод rm, не затрагивая вывода find?



Последнее исправление: allext (всего исправлений: 3)

Конкретно в этом случае видимо надо добавить раскрашивание внутрь -exec. Но вообще городить такое скриптами по-моему плохой подход.

firkax ★★★★★
()

Соглашусь, что пихать в скрипт, что-то вроде: GREP_COLORS=" ... ", не очень хорошая идея, поэтому ищу более простое решение.
Использовать дополнительный скрипт для rm, мне кажется избыточным.

Изначально, хотел сделать раздельно «Найти» -> «Удалить» -> «Заменить», используя find, grep, rm, cp, но возникли сложности с передачей вывода от одной команды к другой. У меня не получилось, так как файл может быть не один, могут быть пробелы в именах и заворачивание всего этого в переменные оказалось непростой задачей.
После долгих, безуспешных попыток и рысканий в интернетах, нашёл это:

find ~/catalog1/ -type f -exec grep -rl "слово" {} \; -exec rm -v {}

cp заменил на rsync и оно отрабатывает, так как мне нужно.
Есть вопрос: как можно отделить rm и передать ей вывод find и grep-а? Тогда можно было бы попробовать раскрасить вывод rm отдельно.

allext
() автор топика

Тут, кмк, другие бы проблемы порешать.

  1. Не вижу set -e. Не надо - так не надо, но мало ли, вдруг вопрошающий не знает.
  2. Блок else лишний. Можно выйти, если код возврата не 0, а основной флоу держать левее, вне блока if/else.
  3. Опечатки бы исправить. rsyng -> rsync.
paddlewan
()
Ответ на: комментарий от paddlewan

Если что, то я сварщик не настоящий, а просто слесарь у котрого на компе установлена ubuntu.
Очепятку вчера заметил, но на скринах она останется уже. Исправил, хотя она была в выводе эха.

Не вижу set -e. Не надо - так не надо, но мало ли, вдруг вопрошающий не знает.

Вот второе

allext
() автор топика

Использовал grc для раскраски вывода rm. В ~/.grc/conf.rm прописал:

# цвет вывода rm
regexp=[/\s\w\.']
colours=bold white on_red

В .bashrc, к уже имеющимся алиасам для grc, добавил:
alias rm="grc --colour=auto rm"
Теперь, красится только вывод rm, а find в цвете по умолчанию и вроде ничего не сломалось. Скриншот
Можно было бы, конечно, пути в другом цвете сделать, но пока и так сойдёт. Я-то с обычными регулярками на «вы», а с питоновскими, вообще - «ахтойта?!» (: Может быть, попозже, если будет желание.

PS
Наутилус, conf.rm-у назначил иконку «видео» и просит открывать его в видеоплеере. Так, я и узнал о существовании realmedia. Надеюсь, с этой стороны казусов не будет.

allext
() автор топика

Появились вопросы. Добвил теги grc и regexp, так как они связаны с темой.

Есть вопрос про регулярки в /etc/grc.conf. Когда добавлял туда запись для rm, то просто скопировал регулярку от ls, заменив ls на rm. Вот эту:
(^|[/\w\.]+/)ls\s
Сделал так потому, что мне показалось, что выводы ls и rm в чём-то схожи, ну и чтобы было от чего отталкиваться, но конечно, это не есть правильно. Если возможно, то на примере регулярки ls разъясните - как она соотносится с работой ls? Желательно «на пальцах», так чтобы и я - простой слесарь - понял. (: Ну или ссылку где хотя бы по русски было написано. Если правильно понимаю; в /etc/grc.conf записано что именно обрабатывать, а в конфигах conf.XX - как именно.

Также, вопрос по регулярке для выхлопа rm. Как для удалён '/home/user/catalog/file' сделать шаблон «только для того, что в одинарных кавычках»? На хабре видел такое:

#текст в скобках ( ) и кавычках ' '
regexp=\([\w\d,']+\)

Пытался разобрать её, но ¯\_(ツ)_/¯
Отталкиваюсь от Generic Colouriser и Regular Expression HOWTO, но без базы и с переводом через тындекс.
Прошу помощи зала.

allext
() автор топика

Имеется скрипт, который находит в каталоге catalog1 текстовые файлы содержащие, например, «слово» и заменяет их на такие же, но без текста «слово», копируя их из catalog2.

Я бы так сделал, скорее всего

find /catalog1 -type f | while read F1; do
   if grep -q 'слово' "$F1"; then
     # найден файл $F1 со "словом"
     echo 'Заменяем на резерв из каталога 2'
     F2=$(echo "$F1" | sed 's/catalog1/catalog2/')
     cp -v "$F2" "$F1"
   fi
done
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 5)