LinuxForum.Fans
Тема

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

Автор: sergey_dydchenko 48 сообщений 12503 просмотров
03.02.2014 10:23 · отредактировано #363971

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

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

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

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

text
#!/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 скриптов. И только приобретаю опыт.

03.02.2014 10:34 #363972

Попробуйте

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

P.S.

"sergey_dydchenko" написал:
Заменить нужно 192.168.1.54
"sergey_dydchenko" написал:
-exec grep -H "192.168.1.56"

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

03.02.2014 10:39 · отредактировано #363974
Lupo Alberto написал:
P.S.
[quote="sergey_dydchenko"]Заменить нужно 192.168.1.54
"sergey_dydchenko" написал:
-exec grep -H "192.168.1.56"

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

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

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

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

Верно?

03.02.2014 10:42 · отредактировано #363976
"sergey_dydchenko" написал:
Верно?

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

03.02.2014 11:17 · отредактировано #363981

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

03.02.2014 11:37 · отредактировано #363984

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

text
#!/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), и в случае добавления новых файлов автоматически производить замену и поиск как было решено выше?

03.02.2014 11:51 · отредактировано #363987
"sergey_dydchenko" написал:
Как-то так да?

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

text

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

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

text

find  /volume1 -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
"sergey_dydchenko" написал:
И еще такой вопрос. Возможно ли задать скрипту такую задачку: -Отслеживать изменения в указанной папке (допустим /volume1/test), и в случае добавления новых файлов автоматически производить замену и поиск как было решено выше?

Можно.

03.02.2014 11:53 #363988
"Lupo Alberto" написал:
...или сразу искать в общем для них каталоге

...или так

text
find  /volume1/test /volume/test1 -type f -name "*.txt" -exec sed -i 's/192\.168\.1\.56/192\.168\.178\.111/g' "{}" \;
03.02.2014 11:58 #363989

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

Можно.

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

03.02.2014 12:05 · отредактировано #363992

Спасибо

03.02.2014 12:36 #363996

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

02.05.2014 14:16 #378561

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

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

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

02.05.2014 14:38 #378562
"sergey_dydchenko" написал:
find /volume1/test -type f -name "*.txt" -exec sed -i 's/Multimedia\ZAMENA/g' "{}" \;

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

02.05.2014 14:43 #378563
"Lupo Alberto" написал:
И, вообще-то, все замены можно в одну команду sed вставить.
text
█▓▒░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
02.05.2014 15:07 #378565

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

"Lupo Alberto" написал:
"{}"
тут кавычким не нужны.
02.05.2014 16:33 #378569
"drBatty" написал:
тут кавычким не нужны.

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

02.05.2014 16:36 #378570
"Lupo Alberto" написал:
А если имя содержит пробелы?

попробуйте.

Войдите или зарегистрируйтесь, чтобы ответить.