linux - массовый поиск и замена в файлах

Поиск текста по файлам в Linux:

grep -rl 'text' /var/www/
- ищем файлы, в которых имеется ‘text’
grep -rl 'text' ./
- то же, но в текущей категории..

Поиск и удаление файлов, содержащих строку
78.46.14.162

find /var/named/ -type f -exec grep "MX" {} ; -print | grep named
(имя файла и найденный текст)

find . -name '*.*htm*' -exec grep -i iframe {} ; -print | less
ищем iframe (файлы, перезаписанные вирусом).

Массовый поиск и замена в файлах:

sed -i~ "s/search text/replace text/g" index.php
i~ - флаг, указывающий на то, что оригинальный файл будет сохранен как file.ext~
g - заменяем не только первое вхождение

поиск и замена в нескольких файлах с использованием perl
perl -pi~ -e 's/foo/bar/' [files]

Поиск и замена с использованием sed (ищем скрипт и заменяем его на комментарий. Экранируем восклицательный знак:
sed -i.~ "s/≶script>var k;.*script>/≶\!-- deleted -->/g" index.php

Флаг -i (inplace) означает, что результат следует сделать в файле. При наличии символов после -i резервная копия сохраняется в соответствующий файл (некоторые системы не дают выполнить команду с флагом -i без сохранения резервной копии).
Для удобства дальнейшего удаления использую -i.~ (можно -i.bak - сохранит файлы, добавляя расширение bak). Дальнейшее удаление при помощи команды find + delete
find ./ -name '*.~' -delete

http://mywiki.wooledge.org/BashFAQ/021

Пригодилось при замене вирусных кодов на сайте - первым этапом поиск файлов, затем - дальнейшая замена. В принципе, можно сделать всё одним махом. В случае замены флаг -i

Подсчет количества конкретных слов в файле:
http://www.linux.org.ru/forum/general/5120319

Поиск строки с указанием её номера grep -n ‘needle’ file.txt

Просмотр файла, начиная со строки 532
more +532 file.txt

Массовое переименование файлов в linux - rename регулярка (/что заменять/на что заменять/ в каких файлах)
rename "s/.JPG/.jpg/g" *.JPG
http://www.cyberciti.biz/tips/renaming-multiple-files-at-a-shell-prompt.html

Поиск файлов по размеру

Для удаления файлов, найденных командой find достаточно указать дополнительный параметр -delete

Поиск php файлов размером 535 байт (c - указывает на размер в байтах, по умолчанию - в блоках 512)
find ./ -type f -name '*.php' -size 599c
При указании размера со знаком плюс или минус - происходит поиск файлов соответственно больше или меньше указанного значения.

Поиск подстроки в недавно модифицированных файлах (40 дней назад ! минус перед числом обязателен):
find ./ -name "*.php" -mtime -40 -exec grep "breadcrumb" {} \;

Поиск файлов find + последующий grep для них (find + exec grep).. во второй строчке - ещё и удаление
find ./ -type f -name '*.php' -size 599c -exec grep -l "c1120ba44a14664ed80cfa5a18832c1b9b39dec0" {} \;
find ./ -type f -size 599c -exec grep -l "c1120ba44a14664ed80cfa5a18832c1b9b39dec0" {} \; -delete
Поиск файлов больше мегабайта (+1M) меньше (-1M)
find ./ -type f -size +1M

Поиск файлов с нулевой длиной
find ./ -type f -size 0
Поиск и удаление файлов с нулевой длиной (вторым парамтером - путь к каталогу.. ./ означает текущий
find ./ -type f -size 0 -delete

Поиск номеров строк
в файле (чтобы grep вывел номер строки - используем с параметром -n)

Чтобы вытащить определённые строки из файла (или удалить строки в начале файла и в конце файла), можно использовать sed - выведет строки с 4 по 17
sed -n '3,10p' file.txt

Переместить файлы размером >2Mb в каталог /tmp (и вообще выполнить любую команду с файлами)
find ./ -size +2M -exec cp {} /tmp \;

Ресайз всех изображений в каталоге, размер которых превышает 2М
find ./ -size +2M -exec convert {} -resize 1200x1200 {} \;

Ресайз всех изображений, по маске
find ./ -name '493_*' -exec convert {} -resize 1200x1200 {} \;

Рекурсивно удалить все .svn директории в подкаталогах
find . -name ".svn" -exec rm -rf {} \;

Метки:

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (2) к записи “linux - массовый поиск и замена в файлах”

  1. Stepan сообщает :

    Спасибо, очень помогло. Но в Массовый поиск и замена в файлах:… пришлось заменить кавычки на фигурные скобки. Пробовал в OpenSuSE 11.4.

  2. Johnde сообщает :

    Разные “времена” файла
    find -name “*.*” -mtime -40 -mtime +2
    find -name “*.*” -ctime -40 -ctime +2

Добавить комментарий