Назад | Перейти на главную страницу

Рекурсивно изменять имя файла и содержимое внутри файла, если оно соответствует ключевому слову.

Я могу использовать sed для рекурсивного поиска и замены строки в группе файлов. Вот так:

find -name  "*.py"  -not \( -name .svn -prune \) -type f -print0  | xargs
-0  sed -i 's/cat/dog/g'

Однако есть ли способ искать строку как внутри файла, так и в фактических именах файлов?

Если строка находится в имени файла, замените строку в имени файла новой строкой.

Если строка находится внутри фактического файла, замените строку новой строкой.

И, конечно, рекурсивный поиск.

Любые идеи?

Я не знаю, как сделать это за один раз, но это легко сделать с помощью небольшого скрипта, например (слегка проверено):

find -name  "*.py"  -not \( -name .svn -prune \) -type f -print0 \
| while read -r -d $'\0' filename; do
    sed -i 's/cat/dog/g' "$filename"
    echo "$filename" | grep -q "cat" \
    && mv "$filename" "${filename/cat/dog}"
  done