Wednesday, September 19, 2007

Пакетная обработка файлов, обратный grep

Линух знаю плохо, но стараюсь учиться. Поэтому долго и нудно ищу решения повторяющихся проблем.
1. Проблема. : Нужно применить одну команду к списку файлов.
Решение xargs:
Пример :
Данные
ls -la
1.deb
2.deb
Установка всех деб пакетов.
ls *.deb | xargs sudo dpkg -i
Данные
Директория с исходниками, нужно найти файлы где встречается строка "xxxx"
find ./ (найти все файлы )
find ./ | xargs grep "xxxx" (найти все файлы в каждом файле найти строчку "xxxx"
2. Проблема
Встречаются директории и имена файлов разделенных пробелами, xargs считает это разными входыми парамертами,
Например

$:~/tests$ ls
xxx xx x
$:~/tests$ find ./ | xargs ls
ls: ./xx: No such file or directory
ls: x: No such file or directory
./:
xxx xx x
./xxx:
cd@cd-laptop:~/tests$

Решение
Решение найдено тут : http://linux.presscom.org/25924.html
Чтобы не забыть пишу для себя.


Проблема очевидна, пробел в имени совпадает с разделителем аргументов.
Решение простое - и find и xargs умеют создавать и принимать список аргументов, разделеных нуль-байтом.
$ find ./ -name "t*" -print0 | xargs -0 ls
./test ./te st

Т.е. для моего примера это будет
$find ./ -print0 | xargs -0 lj

3. Проблема
Нужен инверированный grep (обратный)
Решение
grep -v (долго искал, ман плохо читал )
Например
Поиск строки в исходниках, не показывая svn каталоги
find ./ | grep -v 'svn' | xargs grep "xxxx"
(найти все файлы, исключить строки где есть svn, в каждом файле из полученного списка применить поиск "xxx")

No comments:

 
Каталог сайтов, Добавить сайт