Рекурсивно заменить символ во всех именах файлов на Linux
Заменить некоторые символы в именах файлов понадобилась после копирования сайта командой wget
. Получилось, что символ ?, в именах файлов, заменился на сочетание символов – %3f. Для нас это не подходит, так как ссылки в коде сайта на файлы с вопросительным знаком. Усугубляется это тем, что файлов несколько тысяч.
Нужно редактировать их все и желательно пакетно и рекурсивно.
Подготовка
Если вы используете Debian, нужно установить дополнительный пакет rename
, которого нет в официальном репозитории, и при исполнении команды по замене символов вы получите ошибку: bash: rename: command not found
sudo apt install rename
Скрипт замены
Ниже представлено 2 скрипта, которые позволяют производить замену как в названиях файлов, так и в названиях директорий.
Стоит обратить внимание на часть кода: 's\%3f\?\'
, где:
- s – неизменяемый параметр;
- %3f – что ищем в названиях;
- ? – на что заменяем.
Все эти части разделены обратным слешем. Одинарные кавычки обязательны.
По файлам
Меняем в названии файлов %3f на ?:
find ./ -type f -exec rename -v 's\%3f\?\' {} \;
Чтобы запустить скрипты в «холостую», нужно команду rename запустить с параметром -n
.
Запустить без изменений
find ./ -type f -exec rename -v -n 's\%3f\?\' {} \;
По директориям
Меняем в названии директорий %3f на ?:
find ./ -type f -execdir rename -v 's\%3f\?\' {} \;
Ниже код для запуска для проверки.
Запустить без изменений
<span>find ./ -type f -execdir rename -v -n 's\%3f\?\' {} \;</span>
Заключение
Во время работы оба скрипта будут выводить: «как было» и «как стало».
Теги: bash