1 (03.02.2014 10:38:35 отредактировано sergey_dydchenko)

Здравствуйте старожилы, очень сильно нуждаюсь в Bash скрипте. Данный скрипт должен найти определённую строку во всех .txt файлах, всех каталогов и подкаталогов (то есть полностью во всех папках). И заменить ее на мной указанную.

В моем случае поиск будет происходить по пути: /volume1/test
Заменить нужно 192.168.1.56 на 192.168.178.111

Папки (в которых будет происходить поиск текстовых файлов) могут содержать и русские названия, кроме того имеются в названиях как символы так и пробелы. Если конечно это важная информация.
Пример пути: \volume1\test\_Фильмы\007-001 Доктор Ноу\007-001 Доктор Ноу

Применение данного скрипта помогло частично:

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

возможно в силу специфики аппарата для которого пишется данный скрипт.
Аппарат: Synology DS1813+
Не происходит полный поиск и замена во всех подкаталогах и во всех txt файлах. Хотя скрипт запускается от root.

Для того чтобы видеть картину целяком прикрепляю результаты теста скрипта написанного выше:

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

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

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

_Общая test

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

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

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

Вроде как объяснил более чем доступно, спасибо всем откликнувшимся. Прошу помощи так как сам не располагаю достаточным количеством знаний в написании Bash скриптов. И только приобретаю опыт.

2

Попробуйте

find  /volume1/test -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
Был, был и весь вышел...

3

P.S.

sergey_dydchenko пишет:

Заменить нужно 192.168.1.54

sergey_dydchenko пишет:

-exec grep -H "192.168.1.56"

Я исходил из того, что верен второй вариант.

Был, был и весь вышел...

4 (03.02.2014 10:40:23 отредактировано sergey_dydchenko)

Lupo Alberto пишет:

P.S.

sergey_dydchenko пишет:

Заменить нужно 192.168.1.54

sergey_dydchenko пишет:

-exec grep -H "192.168.1.56"

Я исходил из того, что верен второй вариант.

Спасибо, ошибку (54) исправил.

То есть получается такой скрипт:

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

Верно?

5 (03.02.2014 10:44:49 отредактировано Lupo Alberto)

sergey_dydchenko пишет:

Верно?

Да. Если на этом «аппарате» действительно есть /bin/sh, проверьте.

Был, был и весь вышел...

6 (03.02.2014 11:37:12 отредактировано sergey_dydchenko)

Lupo Alberto очень Вам благодарен. Скрипт полноценно работает. После работы скрипта, скрупулёзно проверил 1681 txt файл (через notepad++), нужные изменения были внесены должным образом в каждый файлик. Еще раз спасибо.  http://files.myopera.com/Creat0R/Opera_AC/Icons/thank_cool.gif

7 (03.02.2014 11:45:32 отредактировано sergey_dydchenko)

А как в скрипт прописать еще папки в которых нужно произвести аналогичную замену?

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

Как-то так да?

И еще такой вопрос. Возможно ли задать скрипту такую задачку: -Отслеживать изменения в указанной папке (допустим /volume1/test), и в случае добавления новых файлов автоматически производить замену и поиск как было решено выше?

8 (03.02.2014 11:51:26 отредактировано Lupo Alberto)

sergey_dydchenko пишет:

Как-то так да?

Можно и так.
Можно так

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

...или сразу искать в общем для них каталоге

find  /volume1 -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
sergey_dydchenko пишет:

И еще такой вопрос. Возможно ли задать скрипту такую задачку: -Отслеживать изменения в указанной папке (допустим /volume1/test), и в случае добавления новых файлов автоматически производить замену и поиск как было решено выше?

Можно.

Был, был и весь вышел...

9

Lupo Alberto пишет:

...или сразу искать в общем для них каталоге

...или так

find  /volume1/test /volume/test1 -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
Был, был и весь вышел...
sergey_dydchenko пишет:

И еще такой вопрос. Возможно ли задать скрипту такую задачку: -Отслеживать изменения в указанной папке (допустим /volume1/test), и в случае добавления новых файлов автоматически производить замену и поиск как было решено выше?

Можно.


Lupo Alberto боюсь показаться назойливым. Можно Вас попросить пример такого скрипта? Я так понимаю в конечном итоге данный скрипт будет запущен как служба.

11

https://github.com/rvoicilas/inotify-tools/wiki
http://rus-linux net/MyLDP/kernel/Inotify-tools.html

Был, был и весь вышел...

12 (03.02.2014 12:43:47 отредактировано sergey_dydchenko)

Спасибо

13

Вот ещё удобная программа — iWatch.

Был, был и весь вышел...

14 (03.02.2014 12:44:33 отредактировано sergey_dydchenko)

Спасибо, но уже решил https://github.com/rvoicilas/inotify-tools/wiki ковырять.

Ребят а как добавть в скрипт еще одно слово для замены?

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

Как-то не кактит (

16

sergey_dydchenko пишет:

find /volume1/test -type f -name "*.txt" -exec sed -i 's/Multimedia\ZAMENA/g' "{}" \;

Слэш «неправильный».
И, вообще-то, все замены можно в одну команду sed вставить.

Был, был и весь вышел...

17

Lupo Alberto пишет:

И, вообще-то, все замены можно в одну команду sed вставить.

█▓▒░lupo@asus-x201e█▓▒░ Пт май 02 01:43:10 
/tmp/test/ cat test.txt
abc
123
abc ABC
123 456
█▓▒░lupo@asus-x201e█▓▒░ Пт май 02 01:43:14 
/tmp/test/ find . -name "*.txt" -exec sed -i 's/123/000/g;s/abc/ABC/g' "{}" \;
█▓▒░lupo@asus-x201e█▓▒░ Пт май 02 01:43:20 
/tmp/test/ cat test.txt                                                       
ABC
000
ABC ABC
000 456
Был, был и весь вышел...

18

Lupo Alberto, таки всё верно, но ИМХО лучше юзать sed -i*~ для того, что-бы старый файл не удалялся.

Lupo Alberto пишет:

"{}"

тут кавычким не нужны.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

drBatty пишет:

тут кавычким не нужны.

А если имя содержит пробелы?

Был, был и весь вышел...

20

Lupo Alberto пишет:

А если имя содержит пробелы?

попробуйте.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

Ребят боюсь вас достать. Но позволю себеб еще один ворос. Как добавить еще одно расширение для поиска .m3u?

22

 Консоль:
drb@amilo:~/tmp/z$ find -exec file {} \;
.: directory
./b b: empty
./a a.gpg: GPG encrypted data
./a a: empty
drb@amilo:~/tmp/z$ find -exec file {} +
.:         directory
./b b:     empty
./a a.gpg: GPG encrypted data
./a a:     empty
drb@amilo:~/tmp/z$ ll
итого 4,0K
-rw-r--r-- 1 drb users   0 апр  1 19:15 a\ a
-rw-r--r-- 1 drb users 864 апр  2 15:28 a\ a.gpg
-rw-r--r-- 1 drb users   0 апр  1 19:15 b\ b

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

23 (02.05.2014 16:43:13 отредактировано drBatty)

sergey_dydchenko пишет:

Ребят боюсь вас достать. Но позволю себеб еще один ворос. Как добавить еще одно расширение для поиска .m3u?

в find?

 Консоль:
$ find \( -name "*.mp3" -o -name "*.m3u" \)
./y.m3u
./y.mp3
./x.mp3
$ find \( -name "*.mp3" -o -name "*.m3u" \)
./y.m3u
./y.mp3
./x.mp3

PS: лучше освоить регулярные выражения.

для начала освойте

 Консоль:
man 7 regex

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

24

sergey_dydchenko пишет:

Как добавить еще одно расширение для поиска .m3u?

find . -name "*.txt" -o -name "*.m3u"
Был, был и весь вышел...

25

Lupo Alberto, сотрите этот пост: Скрипт для поиска и замены текста во всех txt, всего каталога

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

26 (02.05.2014 16:46:40 отредактировано sergey_dydchenko)

Спасибо

27

drBatty пишет:
Lupo Alberto пишет:

А если имя содержит пробелы?

попробуйте.

...я был слишком наивен и доверчив. Вы правы.

Был, был и весь вышел...

Чет не катит

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

29

drBatty пишет:

сотрите этот пост: Скрипт для поиска и замены текста во всех txt, всего каталога

А что с ним не так?
«Критикуя — предлагай...» ©

Был, был и весь вышел...

30 (02.05.2014 16:54:26 отредактировано Lupo Alberto)

sergey_dydchenko пишет:

Чет не катит

#!/bin/sh
find /volume1/3D_movie_cat -type f -name "*.txt" -o -name "*.m3u" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
find  /volume1/3D_movie_cat -type f \( -name "*.txt" -o  -name "*.m3u" \) -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' {} \;
Был, был и весь вышел...