- 6 способов переименования нескольких файлов сразу в Linux
- Переименование нескольких файлов сразу в Linux
- Метод 1 – Использование mmv
- Способ 2. Использование утилиты rename
- Рекурсивно переименовывать файлы (менять расширение) в Linux
- 5 ответов 5
- Рекурсивное переименование файлов
- Linux рекурсивно переименовать файлы
- Переименование файлов и каталогов рекурсивно в ubuntu / bash
- 5 ответов
6 способов переименования нескольких файлов сразу в Linux
Как вы уже знаете, мы используем команду mv для переименования или перемещения файлов и каталогов в Unix-подобных операционных системах.
Но команда mv не будет поддерживать переименование нескольких файлов одновременно.
Она может переименовывать только один файл за раз.
Доступно несколько других утилит, особенно для пакетного переименования файлов.
В этом уроке мы научимся переименовывать несколько файлов одновременно в шести разных методах.
Все примеры, представленные здесь, тестируются в Ubuntu 18.04 LTS, однако они должны работать на любых операционных системах Linux.
Переименование нескольких файлов сразу в Linux
Может быть много команд и утилит для переименования группы файлов.
Я буду продолжать обновлять список, если буду сталкиваться с любым методом в будущем.
Метод 1 – Использование mmv
Утилита mmv используется для перемещения, копирования, добавления и переименования файлов в массовом порядке с использованием стандартных подстановочных знаков в Unix-подобных операционных системах.
Она доступна в репозиториях по умолчанию систем на базе Debian.
Чтобы установить его на Debian, Ubuntu, Linux Mint, выполните следующую команду:
Скажем, у вас есть следующие файлы в вашем текущем каталоге.
Теперь вы захотите переименовать все файлы, начинающиеся с буквы «a» на «b».
Конечно, вы можете сделать это вручную через несколько секунд.
Но подумайте, есть ли у вас сотни файлов и хотите их все переименовать?
Это довольно трудоемкий процесс. Здесь команда mmv приходит в помощь.
Чтобы переименовать все файлы, начиная с буквы «a» до «b», просто запустите:
Давайте проверим, были ли файлы переименованы или нет.
Как вы можете видеть, все файлы начинаются с буквы «a» (т.е. a1.txt, a2.txt, a3.txt), переименовываются в b1.txt, b2.txt, b3.txt.
Вы даже можете переименовать все файлы с определенным расширением на другое расширение.
Например, чтобы переименовать все .txt-файлы в формат .doc в текущем каталоге, просто запустите:
Вот еще один пример. Скажем, у вас есть следующие файлы.
Вы хотите заменить первое abc на xyz во всех файлах в текущем каталоге. Как бы вы поступили?
Обратите внимание, что в приведенном выше примере я включил шаблоны в одинарные кавычки.
Давайте проверим, действительно ли «abc» заменено на «xyz» или нет.
Файлы abcd1.txt, abcd2.txt и abcd3.txt были переименованы в xyzd1.txt, xyzd2.txt и xyzd3.txt.
Еще одна заметная особенность команды mmv – вы можете просто посмотреть вывод вместо переименования файлов с помощью опции -n, как показано ниже.
Таким образом, вы можете просто проверить, что действительно сделала команда mmv, прежде чем переименовывать файлы.
Для получения дополнительной информации см. Справочные страницы.
Способ 2. Использование утилиты rename
Утилита rename переименовывает данные файлы, заменяя первое выражение в их имени заменой.
Команда rename устанавливается в большинстве Unix-подобных операционных систем.
Если он по умолчанию недоступен, выполните следующую команду, чтобы установить его в системах на базе Debian:
Например, у меня есть следующие файлы в текущем каталоге.
Заменим первое abc на xyz, где бы оно ни находилось. Для этого запустите:
Теперь проверьте, были ли сделаны изменения с помощью команды ls.
Иногда вы можете просто вывести выходные данные вместо переименования файлов.
Если это так, используйте флаг -n для отображения тех переименований, которые будут выполняться без их выполнения:
Как вы можете видеть, приведенная выше команда не вносила никаких изменений, а просто отображает имена переименованных файлов.
Вы можете принудительно переименовать задачу, даже если операция будет перезаписывать существующие файлы с использованием флага -f, как показано ниже.
Если вы не хотите перезаписывать файлы, вы можете просто преобразовать их в заглавные или строчные буквы (и наоборот), чтобы предотвратить «уже существующие» ошибки.
Чтобы преобразовать все имена файлов в нижний регистр:
Давайте проверим, были ли внесены изменения.
Да, буквы в именах файлов были изменены с нижнего регистра на верхний регистр.
Аналогично, чтобы преобразовать имена файлов в нижний регистр, выполните:
Мы также можем удалить все пустые ячейки в имени файла.
Например, у меня есть следующий файл.
Чтобы удалить все пробелы в указанном выше имени файла, запустите:
Теперь имя файла не имеет пробелов.
Заменить пробелы символами подчеркивания:
Возможно, вы захотите изменить расширение файла, но не переименовать имена файлов.
Это также возможно.
Следующая команда переименовала бы все * .txt-файлы в * .doc.
Проверьте изменения с помощью команды ls:
Чтобы удалить расширение во всех файлах, соответствующих .txt, запустите:
Для получения дополнительной информации см. Справочные страницы.
Источник
Рекурсивно переименовывать файлы (менять расширение) в Linux
Как мне рекурсивно переименовать все файлы в каталоге, меняя одно расширение на другое, для тысяч файлов в тысячах подпапок? Я вижу много команд, которые делают почти то, что я хочу, но не совсем.
5 ответов 5
конечно удалите -v, когда будете это делать, иначе вы потеряете время на отображение всех файлов
Удалите -n чтобы фактически выполнить переименование.
Я обнаружил, что этот метод легче и легче читать:
По крайней мере, в деривациях Ubuntu переименование берет список файлов из STDIN, если их нет в командной строке. И это можно легко проверить с помощью:
пока не поймешь правильно.
Переименовывайте файлы и каталоги с помощью find -execdir | rename
Если вы собираетесь переименовывать как файлы, так и каталоги не просто с помощью суффикса, тогда это хороший шаблон:
Параметр awesome -execdir делает cd в каталог перед выполнением команды rename , в отличие от -exec .
-depth убедитесь, что переименование происходит сначала для детей, а затем для родителей, чтобы предотвратить потенциальные проблемы с отсутствующими родительскими каталогами.
-execdir требуется, потому что переименование плохо работает с путями ввода неосновного имени, например, следующие ошибки:
Взлом PATH необходим, потому что -execdir имеет один очень раздражающий недостаток: find чрезвычайно самоуверен и отказывается что-либо делать с -execdir если у вас есть относительные пути в переменной окружения PATH , например, ./node_modules/.bin , в случае сбоя:
find: Относительный путь «./node_modules/.bin» включен в переменную среды PATH, которая небезопасна в сочетании с действием -execdir команды find. Пожалуйста, удалите эту запись из $ PATH
-execdir является расширением GNU find для POSIX. rename основано на Perl и происходит из пакета rename . Проверено в Ubuntu 18.10.
Переименовать обходное решение
Если ваши входные пути не получены из find , или если вам надоело относительное раздражение пути, мы можем использовать некоторые возможности Perl для безопасного переименования каталогов, как в:
sort -r необходима для того, чтобы файлы следовали за соответствующими каталогами, поскольку более длинные пути идут после более коротких с тем же префиксом.
Источник
Рекурсивное переименование файлов
Имеется каталог со множеством подкаталогов, в каждом из которых находится файл «readme». Нужно переименовать каждый файл «readme» в «readme_old». Как это сделать простой командой на bash?
Красиво, но не работает…
пример, как не осилить rename, но не подать вид
Ну не осилил… Только не я один. 🙂
Попытался выпендрится — не получилось. Если ты не в курсе, дружок, не у всех gnu find.
Пример, как не осилить, что rename несколько, но пытаться показать, что что-то знаешь.
Сработало! Огромнейшее СПАСИБО!
Если ты не в курсе, дружок, не у всех gnu find.
У кого нет gnu find, у того нет и rename из util-linux
Попытался выпендрится — не получилось.
А что если я шизофреник, и у меня именно так? А? А? А?
У кого нет gnu find, у того нет и rename из util-linux
Ну так то да, теоретически множество gnu мощнее множества linux-ов. Но это не важно, ибо задача то решается в рамках posix совершенно тупо:
очень интересно содержимое этих readme, заинтриговал
Полезное добавление, спасибо.
Всё проще. readme это условное название. Требовалось только переименование одноимённых файлов.
ибо задача то решается … совершенно тупо
Думаешь, ТС осилит твой перл? Мой ответ соответствует его уровню понимания «простой команды», и он может осилить изменить его под свои нужды.
Изначально такой задачи не было. Эта надуманная проблема началась из-за «попытался выпендрится — не получилось». Я написал свой вариант без какой-либо (эмоциональной) оценки оппонента.
Никто никому здесь не соответствует.
Ответ на подобное всегда на ЛОРе был таким:
cat test. test. test. | perl -e .
Да успокойтесь вы… Вам же было сказано — «попытался выпендриться — не получилось». Что делает хороший человек, когда его просят помочь? Правильно, помогает. Что делает дебил недоучка, с неудовлетворёнными амбициями? Правильно -пытается показать, что он что то знает, но никому не скажет. Попросту выпендривается.
Чтобы не возникало вопросов, скажу «умникам» таки зачем мне это было нужно:
find -type f -name «.checksums» -exec rm -f <> ;
find -type f -name «.pkgfiles» -exec rm -f <> ;
find -type f -name ‘spkgbuild’ -execdir mv spkgbuild Pkgfile ;
find -type f -name Pkgfile -exec sed -i -r ‘s/#\ depends/#\ Depends\ on/g’ <> ;
Просто тупанул в одном месте и «сделал звонок товарищу». Всё, успокойтесь, любители делать гадости…
find -type f -name ‘spkgbuild’ -execdir mv spkgbuild Pkgfile ;
vodz , твой простой posix-совместимый ответ на это
Любитель выдумывать? Про то, что для каждой задачи свой инструмент, не слышали?
Тема же давно решена и скатилась в
попытался выпендриться — не получилось
Поэтому выпендриваемся, не стесняемся.
Да нет, все ок. Через find хороший способ.
Всегда так делаю когда надо подчистить *.pyc.
Не удержался чтоб не пошутить. Чего обижаться — это ж ЛОР
Источник
Linux рекурсивно переименовать файлы
Итак, у нас есть куча файлов, среди которых надо навести порядок. Для этого сделаем групповое переименование.
Rename
Утилита rename входит в стандартную поставку Debian, так что начнем с нее.
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
-v отобразить имена успешно переименованных файлов.
-n отобразить список файлов, которые будут переименованы, без переименования в итерации.
-f перезаписать уже существующие файлы.
perlexpr — шаблон для переименования.
Для того, чтобы выполнить переименование файлов согласно условию, выполним команду:
# rename ‘s/.sh/.sh.bak/g’ *.sh
Рассмотрим perlexr подробнее:
s=указывает, что требуется замещение.
/.sh/=Строка, которую будем замещать.
/.sh.bak/ = строка, на которую будем замещать
g=global, будем замещать все найденные вхождения.
С помощью rename можно быстро изменить регистр файлов. Например поднимем регистр файлов из примера:
MMV
mmv — программа для массового перемещения, переименования, копирования, объединения файлов.
По умолчанию она не включена в состав Debian. Поставим ее:
# apt-get install mmv
Наша задача решается одной строкой:
MV
Теперь решим нашу задачу стандартной командой mv. Для этого нам прийдется немного попрограммировать в bash.
for i in *.sh;
do mv $i `basename $i sh`sh.bak;
done
Попробуем усложить задачу. Например у нас есть куча файлов JPG:
1234234.jpg
e456567657.jpg
234df34.jpg
…
Мы хотим привести их к следующему виду:
file1.jpg
file2.jpg
file3.jpg
…
j=0;
for i in *.jpg;
do let j+=1;
mv $i file$j.jpg ;
done
В любимом многими mc, процесс переименования по маске выполняется просто и непринужденно в два действия.
1. Через + выбираем файлы по маске *.sh
2. Нажимаем F6 и в destination указываем *.sh.bak
Все примеры, приведенные выше, так или иначе работают во всех Linux, BSD, Mac OS, если стоят соответствующие утилиты.
Источник
Переименование файлов и каталогов рекурсивно в ubuntu / bash
Я хочу переименовать все файлы и каталоги, содержащие слово «special» в «regular». Он должен поддерживать чувствительность к регистру, чтобы «Специальный «не стал»регулярным».
Как я могу сделать это в bash рекурсивно?
5 ответов
попробуйте сделать это (require bash —version >= 4):
удалить -n переключатель, когда ваши тесты в порядке
есть другие инструменты с тем же именем, которые могут или не могут это сделать, поэтому будьте осторожны.
если вы выполните следующую команду ( GNU )
и у вас есть результат как
и не содержащие:
затем эта кажется, это правильный инструмент =)
если нет, чтобы сделать его по умолчанию (обычно уже) на Debian и производные, такие как Ubuntu :
(вместо /path/to/rename в путь .
если у вас нет этой команды, найдите диспетчер пакетов, чтобы установить его или сделать это вручную
и последнее, но не менее важное: этот инструмент был первоначально написан Ларри Уоллом, отцом Perl.
решение с использованием find :
переименовать только файлы:
переименовать каталоги только:
переименовать как файлы и каталоги:
Если вы не против установки другого инструмента, то вы можете использовать rnm:
Он будет проходить через все каталоги/подкаталоги (из-за -dp -1 ) и заменить специальные С обычный в их имена.
@speakr это был для меня ключом.
если вы используете-execdir для преобразования файлов и каталогов, вы также захотите удалить -type f из приведенного примера. Чтобы разобрать его, используйте:
find /your/target/path/ -execdir rename ‘s/special/regular/’ ‘<>‘ \+
кроме того, подумайте о добавлении g (глобальный) флаг в regex, если вы хотите заменить все возникновения special С regular в данном имени файла, а не только в первом вхождении. Для пример:
find /your/target/path/ -execdir rename ‘s/special/regular/g’ ‘<>‘ \+
превратят special-special.jpg to regular-regular.jpg . Без глобального флага вы получите regular-special.jpg .
FYI: GNU Rename не установлен по умолчанию на Mac OSX. Если вы используете менеджер пакетов Homebrew, brew install rename исправит это.
для тех, кто просто хочет переименовать каталоги, вы можете использовать эту команду:
Примечание тип теперь d для каталога, и с помощью -execdir .
Я не смог понять, как переименовать файлы и каталоги за один проход.
кто-то ранее прокомментировал, что после переименования корневой папки он больше не может пересекать дерево файлов. Есть -d переключатель доступный который делает траверсал глубины от снизу вверх, поэтому корень будет переименован последним, я считаю:
Источник