Перейти к содержанию
Форум русской поддержки продукции Synology

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


Рекомендованные сообщения

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

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

#!/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

Ссылка на сообщение
Поделиться на другие сайты

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

 

Нашёл вот такую темку 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}%"

 

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

Ссылка на сообщение
Поделиться на другие сайты
Не могу понять, что же не так? Скрипт не работает!

 

Нашёл вот такую темку 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}%"

 

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

 

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

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

 

#!/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

 

Ссылка на сообщение
Поделиться на другие сайты
Доброго дня!

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

 

#!/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

 

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

Ссылка на сообщение
Поделиться на другие сайты
Здравствуйте Алексей, у Вас скрипт по данному принципу заработал?

 

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

 

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

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

Все было замечательно пока задача не усложнилась. Как произвести поиск всех существующих 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 Доктор Ноу

Ссылка на сообщение
Поделиться на другие сайты
Все было замечательно пока задача не усложнилась. Как произвести поиск всех существующих 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

Ссылка на сообщение
Поделиться на другие сайты

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

 

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

#!/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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...
×
×
  • Создать...