synology.forum архив спільноти · 2005–2022
ai.synology.forum →
ГлавнаяУправление Системой › Планировщик заданий: Найти и заменитьстроку в txt после синхронизации общих папок

Планировщик заданий: Найти и заменитьстроку в txt после синхронизации общих папок

dydaevskiy · 23.01.2014

Имеются два Synology в России и Германии. Между ними будет настроена синхронизация. После того как произойдёт синхронизация нужно настроить (написать) скрипт в планировщике заданий таким образом, что бы каждый раз после синхронизации происходили автоматический поиск и замена в .txt файлах, нужной мне части текста. И в определённых общих папках (в данные папки будет идти репликация при синхронизации).

 

Прошу помощи у специалистов сталкивающихся с подобного рода задачами. Так как сам ещё только набираюсь опыта.

 

Предоставляю нужные данные для скрипта.

 

Поиск будет происходить в папке test, раздел 1 (volume1) в планировщике задач скрипт запускаю из папки web

dydaevskiy · 23.01.2014

Исходя из того что прочел вроде как скрипт должен иметь где-то такой вид?:

 

#!/bin/sh
for i in `find /volume1/homes/admin/test -name "*.txt" -exec grep -H "192.168.1.54" {} \; | awk -F":" '{print $1}' | xargs`; do sed -i  's/192.168.1.54/192.168.174.111/g' $i; done

dydaevskiy · 23.01.2014

Не могу понять, что же не так? Скрипт не работает!

 

Нашёл вот такую темку http://forum.searchengines.ru/archive/inde...p/t-789549.html

 

Исходя из нее получается вот такой вот скриптик:

 

#!/bin/bash
#
#Что искать
SEARCH='192.168.1.54'
#Чем заменить
REPLACE='192.168.178.111'
#искать 
find /volume1/test -type f -name "*.txt" -print0 | xargs -0 sed -i -e "s%${SEARCH}%${REPLACE}%"

 

Пока прорабатываю такой вариант.

dydaevskiy · 24.01.2014
Не могу понять, что же не так? Скрипт не работает!

 

Нашёл вот такую темку http://forum.searchengines.ru/archive/inde...p/t-789549.html

 

Исходя из нее получается вот такой вот скриптик:

 

#!/bin/bash
#
#Что искать
SEARCH='192.168.1.54'
#Чем заменить
REPLACE='192.168.178.111'
#искать 
find /volume1/test -type f -name "*.txt" -print0 | xargs -0 sed -i -e "s%${SEARCH}%${REPLACE}%"

 

Пока прорабатываю такой вариант.

 

Не получается, блин.

Alex_Support · 24.01.2014
Исходя из того что прочел вроде как скрипт должен иметь где-то такой вид?:

 

#!/bin/sh
for i in `find /volume1/homes/admin/test -name "*.txt" -exec grep -H "192.168.1.54" {} \; | awk -F":" '{print $1}' | xargs`;
do sed -i  's/192.168.1.54/192.168.174.111/g' $i; done

 

 

Доброго дня!

Попробуйте взять в двойные кавычки путь к папке. Код должен выглядеть так:

 

#!/bin/sh
for i in `find "/volume1/homes/admin/test" -name "*.txt" -exec grep -H "192.168.1.54" {} \; | awk -F  ":" '{print $1}' | xargs`; 
do sed -i 's/192.168.1.54/192.168.174.111/g' $i;
done

 

dydaevskiy · 24.01.2014
Доброго дня!

Попробуйте взять в двойные кавычки путь к папке. Код должен выглядеть так:

 

#!/bin/sh
for i in `find "/volume1/homes/admin/test" -name "*.txt" -exec grep -H "192.168.1.54" {} \; | awk -F  ":" '{print $1}' | xargs`; 
do sed -i 's/192.168.1.54/192.168.174.111/g' $i;
done

 

Здравствуйте Алексей, у Вас скрипт по данному принципу заработал?

Alex_Support · 24.01.2014
Здравствуйте Алексей, у Вас скрипт по данному принципу заработал?

 

Скрипт прекрасно работает. В планировщике задач перед путём к скрипту не забудьте поставить sh:

 

sh /volume1/*путь к вашей папке/*ваш файл*.sh

 

dydaevskiy · 24.01.2014
Скрипт прекрасно работает. В планировщике задач перед путём к скрипту не забудьте поставить sh:

 

sh /volume1/*путь к вашей папке/*ваш файл*.sh

 

Огромное Вам Алексей спасибо! :)

dydaevskiy · 27.01.2014

Все было замечательно пока задача не усложнилась. Как произвести поиск всех существующих txt файлов, во всех вложенных каталогах (во всех папках и под папках ну и т.д.) общей папки? Для последующего поиска и замены строк в найденных txt файлах?

 

Сейчас скрипт выглядит так:

 

#!/bin/sh
for i in `find "/volume1/test" -name "*.txt" -exec grep -H "192.168.1.56" {} \; | awk -F  ":" '{print $1}' | xargs`;
do sed -i 's/192.168.1.56/192.168.178.111/g' $i;
done

 

Папки (в которых будет происходить поиск текстовых файлов) могут содержать и русские названия, кроме того имеются в названиях как символы так и пробелы. Если конечно это важная информация.

Пример пути: \volume1\test\_Фильмы\007-001 Доктор Ноу\007-001 Доктор Ноу

Funny · 27.01.2014
Все было замечательно пока задача не усложнилась. Как произвести поиск всех существующих txt файлов, во всех вложенных каталогах (во всех папках и под папках ну и т.д.) общей папки? Для последующего поиска и замены строк в найденных txt файлах?

 

Сейчас скрипт выглядит так:

 

#!/bin/sh
for i in `find "/volume1/test" -name "*.txt" -exec grep -H "192.168.1.56" {} \; | awk -F  ":" '{print $1}' | xargs`;
do sed -i 's/192.168.1.56/192.168.178.111/g' $i;
done

 

Папки (в которых будет происходить поиск текстовых файлов) могут содержать и русские названия, кроме того имеются в названиях как символы так и пробелы. Если конечно это важная информация.

Пример пути: \volume1\test\_Фильмы\007-001 Доктор Ноу\007-001 Доктор Ноу

 

Попробуйте использовать параметр -d в команде find, т.е.

 

#!/bin/sh
for i in `find "/volume1/test" -d -name "*.txt" -exec grep -H "192.168.1.56" {} \; | awk -F  ":" '{print $1}' | xargs`;
do sed -i 's/192.168.1.56/192.168.178.111/g' $i;
done

 

Если не сработает, попробуйте -d заменить на -depth

dydaevskiy · 27.01.2014

Спасибо Вам огромное. Но все равно не получается. В корне замена без проблем, а в каталогах не фига. :(. Хотя в одном каталоге test изминения были внесены должным образом. Уверен что-то не так из-за Кирилицы. Ща буду ковырять. Еще раз спасибо.

 

dydaevskiy · 27.01.2014

Сформировал подробный отчет в виде изображения ниже:

 

http://s018.radikal.ru/i515/1401/a2/09ed91afdfd6.jpg

 

Прикрепляю архив в котором находятся файлы, которые мной использовались для тестирования (6,19 МБ):

 

_Общая test

 

В данном архиве находится каталог для которого в конечном итоге данный скрипт должен быть задействован (483 МБ):

 

Каталог для которого будет применятся скрипт

 

В случае тестирования распакуйте любой из архивов в корень общей папки Synology.

 

Использовал скрипт:

 

#!/bin/sh
for i in `find "/volume1/test" -depth -name "*.txt" -exec grep -H "192.168.1.56" {} \; | awk -F  ":" '{print $1}' | xargs`;
do sed -i 's/192.168.1.56/192.168.178.111/g' $i;
done

dydaevskiy · 03.02.2014

Мою задачку решил данный скрипт:

 

#!/bin/sh
find  /volume1/test -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;

 

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

 

#!/bin/sh
for dir in "/volume1/test /volume1/test2"
do 
     find  "$dir" -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
done

 

Скрипт полноценно работает. После работы скрипта, скрупулёзно проверил 1681 txt файл (через notepad++), нужные изменения были внесены должным образом в каждый файлик. Еще раз всем спасибо. Тему можно закрывать.

 

ПС. Более подробно по скрипту здесь: http://linuxforum.ru/viewtopic.php?pid=391576#p391576

 

http://print-ex.ru/203-790-large/otkryto-zakryto-oz-02.jpg