У меня много файлов с .abc
расширением, и я хочу изменить их на .edefg
Как это сделать из командной строки?
У меня есть корневая папка со многими подпапками, поэтому решение должно работать рекурсивно.
command-line
bash
rename
batch-rename
tommyk
источник
источник
Ответы:
Переносимый способ (который будет работать на любой POSIX-совместимой системе):
В bash4 вы можете использовать globstar для получения рекурсивных глобусов (**):
Команда (perl)
rename
в Ubuntu может переименовывать файлы, используя синтаксис регулярных выражений perl, который вы можете комбинировать с globstar илиfind
:Также см. Http://mywiki.wooledge.org/BashFAQ/030
источник
"${1%.abc}"
расширяется до значения,$1
кроме без.abc
в конце. Смотрите faq 100 для более подробной информации о манипуляциях с оболочкой.${1%.abc}...
sh -c
первым аргументом назначается $ 0, а все остальные аргументы назначаются позиционным параметрам . Таким образом,_
аргумент является фиктивным, а '{}' - первым позиционным аргументом дляsh -c
.Это сделает необходимую задачу, если все файлы находятся в одной папке
Чтобы переименовать файлы рекурсивно, используйте это:
источник
rename 's/.abc$/.edefg/' /path/to/root/folder/**/*.abc
в современной версии Bash.s
в начале, и какие другие варианты я могу использовать там. Спасибо !Одна проблема с рекурсивными переименованиями состоит в том, что какой бы метод вы ни использовали для поиска файлов, он передает весь путь
rename
, а не только имя файла. Это затрудняет выполнение сложных переименований во вложенных папках.Я использую
find
«s-execdir
действия , чтобы решить эту проблему. Если вы используете-execdir
вместо-exec
, указанная команда запускается из подкаталога, содержащего соответствующий файл. Таким образом, вместо того, чтобы пройти весь путьrename
, он только проходит./filename
. Это значительно облегчает написание регулярного выражения.В деталях:
-type f
означает только искать файлы, а не каталоги-name '*.abc'
означает совпадение только с именами файлов, заканчивающимися на .abc'{}'
это заполнитель, который отмечает место, куда-execdir
будет вставлен найденный путь. Одинарные кавычки необходимы, чтобы позволить ему обрабатывать имена файлов с пробелами и символами оболочки.-type
и-name
являются символом продолжения строки bash. Я использую их, чтобы сделать этот пример более читабельным, но они не нужны, если вы поместите свою команду в одну строку.-execdir
строки обязательна. Это здесь, чтобы избежать точки с запятой, которая завершает команду, которой управляет-execdir
. Веселье!Объяснение регулярного выражения:
s/
начало регулярного выражения\.\/
соответствует ведущему ./, который передается в -execdir. Используйте \ для выхода из. и / метасимволы (примечание: эта часть зависит от вашей версииfind
. См. комментарий пользователя @apollo)(.+)
соответствовать имени файла. Скобки фиксируют совпадение для последующего использования.\.abc
избежать точки, сопоставить азбуку$
закрепить совпадение в конце строки/
отмечает конец части регулярного выражения "match" и начало части "replace"version1_
добавить этот текст к каждому имени файла$1
ссылается на существующее имя файла, потому что мы захватили его в скобках. Если вы используете несколько наборов скобок в части «match», вы можете ссылаться на них здесь, используя $ 2, $ 3 и т. Д..abc
имя нового файла будет заканчиваться на .abc. Нет необходимости экранировать метасимвол точки здесь, в разделе «заменить»/
конец регулярного выраженияДо
После
Подсказка:
rename
опция -n полезна. Он выполняет пробный прогон и показывает, какие имена он изменит, но не вносит никаких изменений.источник
--execdir
начале не проходит,./
поэтому\.\/
часть в регулярном выражении может быть опущена. Может это потому, что я на OSX, а не на UbuntuЕще один портативный способ:
источник
Также смотрите запись о том, почему вы не должны анализировать
ls
.Редактировать: если вам нужно использовать базовое имя, ваш синтаксис будет:
https://unix.stackexchange.com/questions/19654/changing-extension-to-multiple-files
источник
Это то, что я делал и работал довольно так, как я хотел. Я использовал
mv
команду. У меня было несколько.3gp
файлов, и я хотел переименовать их все.mp4
Вот короткий вкладыш для этого:
Который просто просматривает текущий каталог, выбирает все файлы .3gp, затем переименовывает (используя mv) в
ren-name_of_file.mp4
источник
file.3gp
вfile.3gp.mp4
, что может быть не то, что большинство людей хотят..3gp
или.mp4
только для иллюстрации.basename "$i" .mp4
предыдущее расширение вместо «ren- $ i.mp4».Я нашел простой способ добиться этого. Чтобы изменить расширения многих файлов с jpg на pdf, используйте:
источник
Я бы использовал команду mmv из одноименного пакета :
Эти
;
матчи ноль или более ,*/
и соответствует#1
в замене. В*
соответствует к#2
. Не рекурсивная версия будетисточник
Переименовать файлы и каталоги с
find -execdir | rename
Если вы собираетесь переименовывать как файлы, так и каталоги не просто с помощью суффикса, тогда это хороший шаблон:
В отличие от этого, потрясающая
-execdir
опция делаетcd
в каталог перед выполнениемrename
команды-exec
.-depth
убедитесь, что переименование происходит сначала для детей, а затем для родителей, чтобы предотвратить потенциальные проблемы с отсутствующими родительскими каталогами.-execdir
требуется, потому что переименование плохо работает с путями ввода неосновного имени, например, следующие ошибки:PATH
Хакерство требуется , потому что-execdir
имеет один очень досадный недостаток:find
крайне самоуверенный и отказывается что - либо делать с ,-execdir
если у вас есть какие - либо относительные пути в вашемPATH
переменном окружении, например./node_modules/.bin
, в противном случае с:См. Также: Почему использование действия «-execdir» небезопасно для каталога, который находится в переменной PATH?
-execdir
является расширением GNU find для POSIX .rename
основан на Perl и поставляется изrename
пакета. Проверено в Ubuntu 18.10.Переименовать обходное решение
Если ваши входные пути не взяты
find
, или если вам надоело относительное раздражение пути, мы можем использовать некоторые возможности Perl для безопасного переименования каталогов, как в:Я не нашел удобный аналог для
-execdir
сxargs
: https://superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686sort -r
Требуется для того , чтобы файлы приходят после их соответствующих каталогов, так как более длинные пути приходят после того, как более короткие, с тем же префиксом.источник