Как изменить все вхождения слова во все файлы в каталоге - PullRequest
26 голосов
/ 18 января 2012

Я находился в процессе создания класса User, где одним из методов был get_privileges();.

После нескольких часов удара головой в клавиатуру я наконец обнаружил, что предыдущий кодер, которому я унаследовал эту конкретную базу данных, произнес слово " привилегии " как " privelages " База данных MySQL и, следовательно, также повсюду в сотнях файлов, которые получают доступ к этим privelages , записана именно так.

Есть ли способ в Linux ( Ubuntu Server ), чтобы я мог пройти через все места в папке /var/www и заменить " privelages " на " привилегии", чтобы мне не приходилось иметь дело с этой опечаткой и кодом вокруг нее?

Ответы [ 4 ]

47 голосов
/ 18 января 2012

Вариант, который учитывает подкаталоги (не проверено):

find /var/www -type f -exec sed -i 's/privelages/privileges/g' {} \;

Это find всех файлов (не каталогов, указанных -type f) в /var/www, и выполнение sed команда для замены «privelages» на «привилегии» для каждого найденного файла.

6 голосов
/ 18 января 2012

Проверьте это: http://www.cyberciti.biz/faq/unix-linux-replace-string-words-in-many-files/

cd /var/www
sed -i 's/privelages/privileges/g' *
1 голос
/ 29 августа 2018

Я обычно использую этот короткий скрипт, который переименует строку во всех файлах и во всех именах каталогов и именах файлов. Чтобы использовать его, вы можете скопировать приведенный ниже текст в файл с именем replace_string, запустить sudo chmod u+x replace_string, а затем переместить его в папку sudo mv replace_string /usr/local/bin, чтобы иметь возможность выполнить его в любом каталоге.

ПРИМЕЧАНИЕ: это работает только в Linux (протестировано в Ubuntu) и не работает в MacOS. Также будьте осторожны с этим, потому что он может испортить такие вещи, как файлы Git. Я также не тестировал его на двоичных файлах.

#!/usr/bin/env bash

# This will replace all instances of a string in folder names, filenames,
# and within files.  Sometimes you have to run it twice, if directory names change.


# Example usage:
# replace_string apple banana

echo $1
echo $2

find ./ -type f -exec sed -i -e "s/$1/$2/g" {} \;  # rename within files
find ./ -type d -exec rename "s/$1/$2/g" {} \;    # rename directories
find ./ -type f -exec rename "s/$1/$2/g" {} \;  # rename files
0 голосов
/ 23 апреля 2019

для Mac OS:

find . -type f -name '*.sql' -exec sed -i '' s/privelages/privileges/ {} +

Сценарий Matwilso, описанный выше, выглядел бы так, если бы он был разработан для работы в Mac OS

#!/bin/bash

# This will replace all instances of a string in folder names, filenames,
# and within files.  Sometimes you have to run it twice, if directory names change.


# Example usage:
# replace_string apple banana

echo ${1}
echo ${2}

find . -type f -name '*.sql' -exec sed -i '' s/${1}/${2}/ {} + # inside sql scripts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...