Linux как переименовать все файлы в папке
Перейти к содержимому

Linux как переименовать все файлы в папке

  • автор:

Массовое переименование файлов в Linux.

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

Offtop. Переименовать один файл в Linux: mv имя-файла1 имя-файла2

Итак, допустим у нас есть несколько файлов:

myapp.conf myapp.txt myapp.sh whatis.sh 

Файлы sh мы хотим переименовать в sh.bak. Рассмотрим варианты:

Rename

Утилита rename входит в стандартную поставку Debian, так что начнем с нее.

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

-v отобразить имена успешно переименованных файлов.

-n отобразить список файлов, которые будут переименованы, без переименования в итерации.

-f перезаписать уже существующие файлы.

perlexpr — шаблон для переименования.

Для того, чтобы выполнить переименование файлов согласно условию, выполним команду:

rename  

Рассмотрим perlexr подробнее:

s=указывает, что требуется замещение.

/.sh/=Строка, которую будем замещать.

/.sh.bak/ = строка, на которую будем замещать

g=global, будем замещать все найденные вхождения.

С помощью rename можно быстро изменить регистр файлов. Например поднимем регистр файлов из примера:

rename ‘y/a-z/A-Z/’ * 

MMV

mmv — программа для массового перемещения, переименования, копирования, объединения файлов.

По умолчанию она не включена в состав Debian. Поставим ее:

sudo apt-get install mmv 

Наша задача решается одной строкой:

MV

Теперь решим нашу задачу стандартной командой mv. Для этого нам прийдется немного попрограммировать в bash.

Попробуем усложить задачу. Например у нас есть куча файлов JPG:

1234234.jpg e456567657.jpg 234df34.jpg … 

Мы хотим привести их к следующему виду:

file1.jpg file2.jpg file3.jpg … 

Midnight Commander

В любимом многими mc, процесс переименования по маске выполняется просто и непринужденно в два действия.

  1. Через + выбираем файлы по маске *.sh
  2. Нажимаем F6 и в destination указываем *.sh.bak

Все примеры, приведенные выше, так или иначе работают во всех Linux, BSD, Mac OS, если стоят соответствующие утилиты.

На этом все, спасибо за внимание.

Смотрите также
  • maybe? Интересная песочница для отладки операций с файлами в скриптах Linux.
  • Знакомство с CMake. Часть 1. Установка, CMakeLists.txt, сборка.
  • Упрощаем администрирование с etckeeper. Настройка контроля версий конфигов в /etc.
  • HTTPS для сайта на WordPress под управлением nginx.
  • Тестирование производительности веб серверов. Часть первая. Apache Benchmark (ab).
  • ← Предыдущий
  • Следующий →

Как сделать массовое переименование файлов в директории?

Здравствуйте всем! У меня снова появился один из легчайших вопросов, над которым я ломаю голову целые сутки. У меня тут появилось задание сделать скрипт, который переименует файлы в определенной директории :
File1
.
File5
В например :
File1_renamed
.
File5_renamed
Я знаю что это можно сделать через suffix , но в том и загвоздка, что как пример мне дано простое переименование файлов с добавлением этого renamed, и надо сделать именно так. Я подумывал вывести список файлов и переименовать их так, но что-то даже представления не имею как это сделать, чтобы изменения повлияли на названия самих файлов в директории, а не просто как вывод в консоль.

  • Вопрос задан более трёх лет назад
  • 1151 просмотр

8 комментариев

Простой 8 комментариев

AmdInDrive @AmdInDrive Автор вопроса
AVKor, man mv и так понятно что -S, но как это сделать для нескольких файлов в указанной директории?

У файлов расширения будут?

но как это сделать для нескольких файлов

Через цикл for например

появилось задание

Задания, кстати, тут нельзя выкладывать.
AmdInDrive @AmdInDrive Автор вопроса

Steven Konrov, нет, у них нет расширения. Цикл for , это указать все файлы которые хочу переименовать? Видимо правила я недочитал, но надеюсь тогда сделают поблажку, что это не полноценное задание, а часть его, которую я просто не понимаю, связанную с чем-то определенным.

AmdInDrive @AmdInDrive Автор вопроса

Так, все, прочитал правила и походу ресурс не для меня вообще, очень много ограничений, обычному студенту не подходит, так что извините кого отвлек.

AmdInDrive,
for file in *; do echo "$_renamed"; done
Эхо меняем на mv, и один аргумент переделываем на два.

for file in *; do mv "$file" "$_renamed"; done

Так, все, прочитал правила и походу ресурс не для меня вообще, очень много ограничений, обычному студенту не подходит, так что извините кого отвлек.

Да что вы, ещё как подходит. Только вопросы по другому надо задавать))
AmdInDrive @AmdInDrive Автор вопроса
Steven Konrov, ваш ответ один из самых лучших, спасибо, теперь все понятно.
AmdInDrive @AmdInDrive Автор вопроса
Steven Konrov, и если не сложно, продублируйте в ответе, чтобы я отметил как решение.
Решения вопроса 1

shambler81

Виктор Таран @shambler81 Куратор тега Linux

find /var/www/ -type f -exec mv <> <>_renamed \;

find -рекурсивный поиск от заданного каталога и ниже
/var/www - где искать, если в текущем каталоге то можно заменить на .
-type f - только файлы
-exec выполнить с найденным
mv переместить
<> то что найдено в данном случае имя файла
\; - просто закончит команду.
Проверить можно так, вместо переименовывания вы получите просто принт самих команд.

find /var/www/ -type f -exec echo <> <>_renamed \;

5fb18a8d63453365594996.png

Отметить решенным, спасибо кэп.

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 3

Rsa97

Для правильного вопроса надо знать половину ответа
rename -e 's/(.*)/$1_renamed/' *
Ответ написан более трёх лет назад
Нравится 2 1 комментарий
AmdInDrive @AmdInDrive Автор вопроса
Спасибо за ответ, учту на будущее ваш вариант решения.

xotkot

хорошо есть и хорошо весьма

есть много способов как переименовать, вот нагугленные примеры Переименование файлов с помощью find, sed и xargs
конкретно в вашем случае можно сделать так:

ls -1 |awk '' | xargs -n2 mv

с пробелами в названии

ls -1 |awk '' | xargs -n2 mv

Ответ написан более трёх лет назад
Нравится 1 2 комментария
AmdInDrive @AmdInDrive Автор вопроса
Спасибо за ваш ответ, думаю стоит его разобрать на будущее, а пока сделаю попроще.

xotkot

AmdInDrive, тут ничего сложного
создадим директорию и тестовые файлы в ней
mkdir testdir && cd testdir && touch "File "
здесь мы усложнили и сделали название через пробел(File 1)

вывести список файлов текущей директории по одному на строку
ls -1
File 1
File 2
File 3

выведем имена файлов и их изменённых названий:
awk ''
File 1 File 1_renamed
File 2 File 2_renamed
File 3 File 3_renamed
awk - утилита для обработки текста, здесь берём текущую строку($0) и через пробел прописываем её же но с добавкой($0"_renamed")
но так как в названии файла может быть пробел что впоследствии может вызвать казус при обработке, то лучше предохранится и закавычить входящее и исходящее название файлов
awk ''
"File 1" "File 1_renamed"
"File 2" "File 2_renamed"
"File 3" "File 3_renamed"

переместить/переименовать(mv) файлы из первого столбца во второй
xargs -n2 mv

смотрим результат до фактического переименования, ключ -p в команде xargs

ls -1 |awk '' | xargs -p -n2 mv

mv 'File 1' 'File 1_renamed' .
mv 'File 2' 'File 2_renamed' .
mv 'File 3' 'File 3_renamed' .

ок, всё нормально, выполняем убрав ключ -p

ls -1 |awk '' | xargs -n2 mv

смотрим результат
ls -1
File 1_renamed
File 2_renamed
File 3_renamed

в итоге зная одну из утилит обработки текста awk/sed можно очень легко и гибко переименовывать файлы любой сложности

Переименование файлов в Linux

mv rename linux

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

Переименование командой mv

Команда mv (от слова move) используется для переименования или перемещения файлов и директорий из командной строки.

Синтаксис команды mv очень простой:

mv опции источник назначение

источник — файл(ы) или директория, которую необходимо переместить или переименовать.
назначение — файл или директория, в которую будет перемещен источник .

Основные опции:
-f — перезаписывать существующие файлы.
-n — не перезаписывать существующие файлы.
-i — выдавать запрос на перезапись существующих файлов.
-u — не перемещать файлы, которые уже существуют, если существующие файлы новее (время модификации новее).
-v — выводить имя каждого файла перед его переносом.

Как задавать имена файлов и директорий для переименования:

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

Переименование файла

Переименование файла myfile1.dat в файл myfile2.dat:

mv myfile1.dat myfile2.dat

Переименование файла с указанием пути до файла:

mv /home/pingvinus/myfile1.dat /home/pingvinus/myfile2.dat

Переименование директории

Переименование директории /home/pingvinus/mydir1 в директорию /home/pingvinus/mydir2 . Справедливо, если /home/pingvinus/mydir2 не существует.

mv /home/pingvinus/mydir1 /home/pingvinus/mydir2

Если /home/pingvinus/mydir2 существует, то, выполнив команду:

mv /home/pingvinus/mydir1 /home/pingvinus/mydir2

директория mydir1 будет перемещена внутрь директории /home/pingvinus/mydir2 . То есть mydir1 будет в результате находиться по адресу /home/pingvinus/mydir2/mydir1 .

Переименование и перемещение

Если в качестве файла назначения указан новый путь и новое имя файла, то файл будет перемещен и переименован. Например, следующая команда перемещает файл myfile1.dat в директорию /home/pingvinus/dir и переименовывает его в myfile2.dat :

mv /home/pingvinus/myfile1.dat /home/pingvinus/dir/myfile2.dat

Переименование командой rename

Команда rename служит для массового (пакетного) переименования файлов. Она позволяет выполнять замену определенных символов или частей имени файла и использованием Perl-регулярных выражений.

Если вдруг в вашем дистрибутиве нет команды rename , то ее можно установить, выполнив (выберите соответствующую команду для вашего дистрибутива):

sudo apt install rename sudo yum install prename yaourt -S perl-rename

Синтаксис команды rename :

rename опции ’s/ старое_имя / новое_имя ’ файлы

старое_имя — регулярное выражение или часть имени файла, которое нужно заменить на новое_имя .
новое_имя — задает результирующее имя файла (может быть регулярным выражением).

Основные опции:
-f — перезаписывать существующие файлы.
-n — вывести список файлов, которые будут переименованы и их новые имена, но не выполнять переименование.
-v — вывести список обработанных файлов.

Проще всего понять, как пользоваться данной командой, на примерах.

Изменение расширения файлов

Массово изменить расширение .html на .php у всех html-файлов.

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

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

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

Замена пробелов на подчеркивание

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

rename 'y/ /_/' *

Конвертация имен файлов в строчные буквы

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

Конвертация имен файлов в прописные буквы

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

Показать, что именно будет переименовано, но не переименовывать

Чтобы избежать ошибок при переименовании файлов, особенно при использовании сложных регулярных выражений, можно сначала вывести список того, что будет переименовано, но не запускать само переименование. Для этого служит опция -n .

Например, мы хотим изменить расширение у файлов с .jpeg на .jpg . Используем опцию -n , чтобы просто вывести какие файлы будут переименованы:

rename -n 's/\.jpeg$/.jpg/' *

Полное описание команд mv и rename можно получить, выполнив в терминале команды:

man mv man rename

Массовое переименование с использованием программ

Для массового переименования файлов можно воспользоваться программами:

Как на bash переименовать все .txt файлы в папке?

DevMan

Power: вариант "поразительно похоже на вариант от Scorpi" обломится со скрытыми файлами.
плюс он расчитан на запуск только из той же директории где и файлы.
только это никакого рояля не играет: задача в общем виде решена.

Ответы на вопрос 2

Scorpi

for file in *.txt do mv "$file" "new_name" done

Ответ написан более трёх лет назад
Комментировать
Нравится 5 Комментировать
Админ хостинг провайдера
Посмотрите в сторону команды find и примеров ее использования.
Ответ написан более трёх лет назад
Нравится 1 6 комментариев

DevMan

не нужен никакой find - все файлы в одной директории.
DevMan: это не означает что там нет других, не txt файлов

DevMan

Владимир: это означает что все txt из папки можно получитъ командой ls

DevMan: тем не менее find . -type 'txt' -exec mv <> targetname \+ будет работать лучше вашего решения на огромных массивах данных

Николай Павлов: ну тут и вы не праы, у файнда есть некий казус с exec а именно работа с 1 аргуменом в цикле. И у него есть вуой плюс и минус. Плс в том что он валидно работаетс именами типа "Вася пупкин" посколкьу xargs разобьети их на васю и пупкина, но зато при больших масивах xargs может забивать аргументы под максимум таким образом увеличивая скорость работы раз в 300.
да и вы забыли точку с запятой find. -type "txt" -exec comand <> \;

ShamblerR: Для начала, я ничего не понял не понял из вашего комментария. Исправьте все ошибки.
Ну и не всегде нужна точка с запятой. Пример: "find . -exec mv -t ../test/ <> \+"

Если рассматривать точный вариант, я бы написал примерно так " find . -type f | sed -e "p;s/txt/doc/" | xargs -n2 mv" если знать что на что переименовывать. Естественно xargs быстрее отработает. Вариантов куча, можно даже вместо sed+mv юзать сразу rename/#.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *