Мне не совсем понятно, но в чем разница между mv
и rename
(от util-linux-ng 2.17.2
как /usr/bin/rename
)? Есть ли преимущества одного над другим помимо rename
принятия регулярных выражений и mv
нет? Я считаю, что rename
может также обрабатывать несколько переименований файлов одновременно, тогда mv
как не делает этого.
Я не мог найти четкого указания на их man
страницах, что еще отличает их или через некоторое собственное расследование.
type -a rename
аrename --version
?rename is /usr/bin/rename
иrename (util-linux-ng 2.17.2)
соответственно.rename
что в разных дистрибутивах могут означать разные вещи.Ответы:
Это в основном то, что написано на крышке, для обоих.
mv
стандартная утилита для перемещения одного или нескольких файлов к заданной цели. Его можно использовать для переименования файла, если нужно переместить только один файл. Если их несколько,mv
работает , только если целью является каталог, и перемещает туда файлы.Поэтому
mv foo bar
будет либо перемещать файлfoo
в каталогbar
(если он существует), либо переименовыватьfoo
вbar
(еслиbar
он не существует или не является каталогом).mv foo1 foo2 bar
просто переместит оба файла в каталогbar
, или жаловаться, еслиbar
это не каталог.mv
вызоветrename()
функцию библиотеки C для перемещения файлов, и если это не сработает (они перемещаются в другую файловую систему), он скопирует файлы и удалит оригиналы.Если все, что у вас есть,
mv
и вы хотите переименовать несколько файлов, вам придется использовать цикл оболочки. Есть целый ряд вопросов о том , что здесь на сайте, смотрите , например , это , это , и другие .С другой стороны, различные
rename
утилиты переименовывают файлы по отдельности.rename
От Util-Linux , который вы упоминаете делает простую строку замены, например ,rename foo bar *
изменитсяfoobar
наbarbar
, иasdffoo
наasdfbar
. Это не , однако, принимать регулярное выражение!Утилита переименования Perl ( или различные ее экземпляры ) использует выражение Perl для преобразования имен файлов. Скорее всего, будет использоваться команда, где шаблон является регулярным выражением.
s/pattern/replacement/
Как переименование util-linux, так и переименование Perl могут быть использованы для одновременного перемещения файлов в другой каталог, путем внесения соответствующих изменений в имя файла, но это немного неудобно. Ни один не делает больше, чем вызов
rename()
файлов, поэтому переход с одной файловой системы на другую не работает.Что касается того, что у
rename
вас есть, это может зависеть от вашего дистрибутива и / или того, что вы установили. Большинство из них поддерживаютrename --version
, поэтому используйте это, чтобы определить, какой у вас есть.источник
rename '$_=lc' *
строчные имена файлов. Но я думаю, что наиболее распространенным случаем является использованиеs///
(которое я упомянул), а часть шаблона - это регулярное выражение; Я не думаю, что вы можете использовать функцию там. Вы можете сделать это в замене, хотя.rename.ul
есть и будет для версии util-linux, а не для какой-либо другой.man rename
так что было бы хорошо узнать ваше понимание примера Debianrename foo foo0 foo?; rename foo foo0 foo??
пример, так как это было единственное различие между этими двумя страницами руководства , которые я видел. Эта пара команд работает, потому что первая добавляет ноль к именам каждого однозначного имени файла, а после этого вторая добавляет (еще одну) ноль к каждому двузначному имени файла. Этот второй набор включает в себя файлы, переименованные в первой команде. Использованиеrename foo foo00 foo?
в качестве первой команды также работает, она просто добавляет два нуля за один раз.mv
просто меняет имя файла (он также может переместить его в другую файловую систему или путь). Вы даете ему старое имя и новое имя, и оно меняет файл на новое имя или местоположение.rename
используется для внесения массовых изменений имен Скажем , у вас была тысяча файлов,foo000.log
черезfoo999.log
и вы хотите изменить их ,bar000.log
просматриваяbar999.log
. Сmv
вы должны делатьmv foo000.log bar000.log
,mv foo001 bar001.log
и т.д. , или же написать сценарий. Сrename
просто сделатьrename foo bar foo*.log
, и вуаля, тысячи файлов изменяются в одно мгновение! Довольно круто. Проверьтеman rename
страницу еще раз для деталей.источник
милливольт
Это базовая командная строка, предназначенная для того, чтобы делать одну вещь и делать это хорошо (философия Unix): перемещать файлы или каталоги .
Вы можете взломать
STDOUT
&STDIN
¹, чтобы на лету изменить строку назначения, но это просто не умный взломпереименовать (Perl's)
Существуют другие инструменты с таким же именем, которые могут или не могут сделать это, поэтому будьте осторожны.
Когда говорят о людях
rename
, мы думаем об этом, а не оELF
менее влиятельном (волшебном?).Это не просто, это Perl. Вы можете передать некоторые функции Perl внутрь, и это чрезвычайно мощно.
Рассмотрим этот пример:
Вы хотите переименовать кучу файлов, таких как
Вы можете добавлять нули к цифрам
sprintf()
следующим образом (используя регулярные выражения, хе, это Perl: D):Теперь у вас есть:
Не совсем основная команда, не так ли?
Переименование на самом деле не предназначено для перемещения каталогов , но оно может сделать это:
Перемещенный файл
¹ какой-то код, который мы видим на
*.stackexchange.*
сайтахЭто не тот путь , это просто глючит, просто чтобы объяснить, почему использовать правильный инструмент в нужный момент.
источник
sprintf
инг с переименованиемmv перемещает или переименовывает файлы и каталоги и создает их резервные копии; переименовать просто переименовывает файлы.
У mv больше возможностей и опций. Посмотрите на переключатели в справочных страницах для каждого, чтобы увидеть различия в возможностях. Давайте рассмотрим использование man в Ubuntu 18.04LTS (ваш пробег может варьироваться в зависимости от версии каждого пакета):
Параметры mv (без справки и версии)
переименовать параметры (без справки и версии)
источник