Переименование файлов — одна из самых основных задач, которые вам часто приходится выполнять в системе Linux. Вы можете переименовывать файлы с помощью файлового менеджера с графическим интерфейсом или через терминал командной строки.

Переименовать один файл легко, но одновременное переименование нескольких файлов может быть проблемой, особенно для пользователей, которые не знакомы с Linux.

В этой статье вы узнаете, как использовать команды mv и rename для переименования файлов и каталогов.

Переименование файлов с помощью mvкоманды

Команда (за mvисключением перемещения) используется для переименования или перемещения файлов из одного места в другое. Синтаксис mvкоманды следующий:

mv [OPTIONS] source destination

Это sourceможет быть один или несколько файлов или каталогов, а destinationможет быть один файл или каталог.

  • Если вы укажете несколько файлов как source, это destinationдолжен быть каталог. В этом случае sourceфайлы перемещаются в целевой каталог.
  • Если вы укажете один файл как source, а destinationцелью является существующий каталог, то файл будет перемещен в указанный каталог.
  • Чтобы переименовать файл, вам нужно указать один файл в качестве sourceи один файл в качестве destinationцели.

Например, чтобы переименовать файл, file1.txtкак file2.txtвы бы запустили:

mv file1.txt file2.txt

Переименование нескольких файлов с помощью mvкоманды

Команда mvможет переименовывать только один файл за раз, но ее можно использовать в сочетании с другими командами, такими как find или внутри bash for или while циклами, для переименования нескольких файлов.

В следующем примере показано, как использовать цикл for в Bash для переименования всех .htmlфайлов в текущем каталоге, изменив .htmlрасширение на .php.

for f in *.html; do
    mv -- "$f" "${f%.html}.php"
done

Разберем код построчно:

  • Первая строка создает forцикл и выполняет итерацию по списку всех файлов с окантовкой .html.
  • Вторая строка применяется к каждому элементу списка и перемещает файл на новый, заменяя его .htmlна .php. Часть ${file%.html}использует расширение параметра оболочки для удаления .htmlчасти из имени файла.
  • doneуказывает на конец сегмента цикла.

Вот пример использования mvв сочетании с findдля достижения того же, что и выше:

find . -depth -name "*.html" -exec sh -c 'f="{}"; mv -- "$f" "${f%.html}.php"' \;

Команда findпередает все файлы, заканчивающиеся .htmlна в текущем каталоге, mvодин за другим, используя -execопцию. Строка {}представляет собой имя файла, обрабатываемого в данный момент.

Как видно из приведенных выше примеров, переименование нескольких файлов с помощью mvкоманды — непростая задача, поскольку для этого требуется хорошее знание сценариев Bash.

Переименование файлов с помощью renameкоманды

Команда renameиспользуется для переименования нескольких файлов. Эта команда является более продвинутой, mvпоскольку требует некоторых базовых знаний о регулярных выражениях.

Есть две версии renameкоманды с разным синтаксисом. В этом уроке мы будем использовать Perl-версию renameкоманды. Если эта версия не установлена ​​в вашей системе, вы можете легко установить ее с помощью менеджера пакетов вашего дистрибутива.

Установить renameна Ubuntu и Debian

sudo apt install rename

Установка renameна CentOS и Fedora

sudo yum install prename

Установить renameна ArchLinux

yay perl-rename ## or yaourt -S perl-rename

Синтаксис renameкоманды следующий:

rename [OPTIONS] perlexpr files

Команда renameпереименует в filesсоответствии с указанным perlexprрегулярным выражением.

В следующем примере все файлы с расширением будут изменены .htmlна .php:

rename 's/.html/.php/' \*.html

Вы можете использовать -nопцию печати имен файлов, которые нужно переименовать, не переименовывая их.

rename -n 's/.html/.php/' \*.html

По умолчанию renameкоманда не перезаписывает существующие файлы. Передайте -fпараметр, чтобы разрешить перезапись существующих файлов:

rename -f 's/.html/.php/' \*.html

Ниже приведены еще несколько распространенных примеров использования renameкоманды:

Замените пробелы в именах файлов символами подчеркивания

rename 'y/ /\_/' \*

Преобразование имен файлов в нижний регистр

rename 'y/A-Z/a-z/' \*

Преобразование имен файлов в верхний регистр

rename 'y/a-z/A-Z/' \*