root  / my Debian tips&tricks  / grep, find и прочие полезности (то, для чего было бы слишком много целого раздела...) 

Official Debian logo

grep с исключеникм файлов

grep --color -n --exclude=файл_или_маска 'что_искать' где_искать

grep в файлах php в заданном каталоге

find где_искать -type f -iname "*.php" -exec grep -Him1 'что_искать' {} \;

grep в файлах на еоторые выставлены права 777

find где_искать -perm 2 -type f -iname "*.php" -exec grep -Him1 'что_искать' {} \;

поиск файлов заданного типа в определённом каталоге

find где_искать -perm 2 -type f -iname "*.php"

поиск файлов заданного типа измененных за последние 7 дней

find где_искать -type f -iname "*.php" -mtime -7

Рекурсивно найти и заменить текст в файлах

вариант 1:

find . -type f -name '*.html' -exec sed -i 's|что_искать|на_что_менять|g' {} +

вариант 2:

find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' -e 's/foo/bar/g'

Как это работает:

  • find . -type f -name '*.txt'
    - ищет в текущем каталоге и ниже файлы, попадающие под рерулярное выражение, в данном случае: файлы с окончанием .txt
  • xargs
    - собирает эти имена и передает их по очереди в sed
  • sed -i '' -e 's/foo/bar/g'
    - отредактировать файл без резервной копии, и произвести замену глобально

Если надо убрать зависимость от xargs:

find . -type f -name "*.txt" -exec sed -i'' -e 's/foo/bar/g' {} +

Ещё один вариант:

find -name '*.txt' -exec sed -i 's/foo/bar/g' {} +
делает тоже самое с GNU find.

А если используется git, подойдёт вариант:

git grep -lz foo | xargs -0 sed -i '' -e 's/foo/bar/g'

LJ