#1 03.02.2014 06:23:11

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

Здравствуйте старожилы, очень сильно нуждаюсь в 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.

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

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



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

_Общая test

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

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

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

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

#2 03.02.2014 06:34:35

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

Попробуйте

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

#3 03.02.2014 06:35:46

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

P.S.

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

Quote by sergey_dydchenko
-exec grep -H "192.168.1.56"

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

#4 03.02.2014 06:39:11

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

P.S.
Quote by sergey_dydchenko
Заменить нужно 192.168.1.54

Quote by 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 06:42:28

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

Quote by sergey_dydchenko
Верно?

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

#6 03.02.2014 07:17:30

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

#7 03.02.2014 07:37:57

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

#!/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 07:51:03

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

Quote by 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' "{}" \;

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

Можно.

#9 03.02.2014 07:53:43

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

...или так
find  /volume1/test /volume/test1 -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;

#10 03.02.2014 07:58:04

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

Можно.



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

#11 03.02.2014 08:02:18

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

#12 03.02.2014 08:05:32

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

Спасибо

#13 03.02.2014 08:36:08

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

#14 03.02.2014 08:44:19

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

#15 02.05.2014 10:16:22

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

#!/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 02.05.2014 10:38:19

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

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

#17 02.05.2014 10:43:49

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

Quote by 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 02.05.2014 11:07:39

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

Quote by Lupo Alberto
"{}"
тут кавычким не нужны.

#19 02.05.2014 12:33:30

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

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

#20 02.05.2014 12:36:31

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

попробуйте.

#21 02.05.2014 12:36:39

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

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

#22 02.05.2014 12:38:52

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

[console]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
[/console]

#23 02.05.2014 12:41:52

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

[console]$ find \( -name "*.mp3" -o -name "*.m3u" \)
./y.m3u
./y.mp3
./x.mp3
$ find \( -name "*.mp3" -o -name "*.m3u" \)
./y.m3u
./y.mp3
./x.mp3
[/console]

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

для начала освойте
[console]man 7 regex[/console]

#24 02.05.2014 12:42:40

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

find . -name "*.txt" -o -name "*.m3u"

#25 02.05.2014 12:43:49

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

#26 02.05.2014 12:46:16

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

Спасибо

#27 02.05.2014 12:48:20

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

попробуйте.

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

#28 02.05.2014 12:49:39

sergey_dydchenko
Administrator
Зарегистрирован: 03.02.2014
Сообщений: 17
IP-адрес

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

Чет не катит

#!/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 02.05.2014 12:51:18

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

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

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

#30 02.05.2014 12:53:32

Lupo Alberto
Administrator
Зарегистрирован: 04.07.2010
Сообщений: 11 183
IP-адрес

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

Чет не катит

#!/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' {} \;

Board footer