В чем разница между «переименовать» и «mv»?

12

Мне не совсем понятно, но в чем разница между mvи rename(от util-linux-ng 2.17.2как /usr/bin/rename)? Есть ли преимущества одного над другим помимо renameпринятия регулярных выражений и mvнет? Я считаю, что renameможет также обрабатывать несколько переименований файлов одновременно, тогда mvкак не делает этого.

Я не мог найти четкого указания на их manстраницах, что еще отличает их или через некоторое собственное расследование.

Urda
источник
2
Давайте удостоверимся, что мы говорим об одних и тех же вещах; какие выходы от type -a renameа rename --version?
Джефф Шаллер
@JeffSchaller С моей стороны это скорее любопытство, но на одной из моих машин * nix я получаю rename is /usr/bin/renameи rename (util-linux-ng 2.17.2)соответственно.
Урда
6
Существует несколько разных переименований , и это мог быть псевдоним / функция / скрипт, поэтому я просто хотел убедиться, что мы знаем, что это было. Спасибо! Пожалуйста, не стесняйтесь редактировать эти выводы в свой вопрос.
Джефф Шаллер
@JeffSchaller не беспокойтесь, на самом деле эта ссылка, которую я только что обнаружил, показала, renameчто в разных дистрибутивах могут означать разные вещи.
Урда
5
Кажется, ваш вопрос содержит ответ. «В чем разница между джетом и трехколесным велосипедом, кроме того, что струя может летать и летать в несколько тысяч раз быстрее?» :-) ⁠
G-Man говорит: «Восстановите Монику»

Ответы:

21

Это в основном то, что написано на крышке, для обоих.

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, поэтому используйте это, чтобы определить, какой у вас есть.

ilkkachu
источник
Не только «регулярное выражение», но и функция, если это необходимо
Gilles Quenot
@GillesQuenot, ну да, вы можете сделать, например, rename '$_=lc' *строчные имена файлов. Но я думаю, что наиболее распространенным случаем является использование s///(которое я упомянул), а часть шаблона - это регулярное выражение; Я не думаю, что вы можете использовать функцию там. Вы можете сделать это в замене, хотя.
ilkkachu
@ MyWrathAcademia, этот первый пример на странице руководства работает для меня (он просто делает вещи не так, как другие). Кроме того, причина, по которой я связался с man-страницами Debian, заключается в том, что, по крайней мере, там очень ясно сказано, что страница руководства для rename.ulесть и будет для версии util-linux, а не для какой-либо другой.
ilkkachu
@ilkkachu, не могли бы вы добавить объяснение этому первому примеру в своем ответе или в комментарии. Это отличается от примера в, man renameтак что было бы хорошо узнать ваше понимание примера Debian
MyWrathAcademia
@ MyWrathAcademia, я предполагаю, что вы имеете в виду rename foo foo0 foo?; rename foo foo0 foo??пример, так как это было единственное различие между этими двумя страницами руководства , которые я видел. Эта пара команд работает, потому что первая добавляет ноль к именам каждого однозначного имени файла, а после этого вторая добавляет (еще одну) ноль к каждому двузначному имени файла. Этот второй набор включает в себя файлы, переименованные в первой команде. Использование rename foo foo00 foo?в качестве первой команды также работает, она просто добавляет два нуля за один раз.
ilkkachu
2

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страницу еще раз для деталей.

eewanco
источник
2

милливольт

Это базовая командная строка, предназначенная для того, чтобы делать одну вещь и делать это хорошо (философия Unix): перемещать файлы или каталоги .

Вы можете взломать STDOUT& STDIN¹, чтобы на лету изменить строку назначения, но это просто не умный взлом

переименовать (Perl's)

предупреждение Существуют другие инструменты с таким же именем, которые могут или не могут сделать это, поэтому будьте осторожны.

Когда говорят о людях rename, мы думаем об этом, а не о ELFменее влиятельном (волшебном?).

Это не просто, это Perl. Вы можете передать некоторые функции Perl внутрь, и это чрезвычайно мощно.

Рассмотрим этот пример:

Вы хотите переименовать кучу файлов, таких как

foobar_1.txt
foobar_2.txt
foobar_3.txt

Вы можете добавлять нули к цифрам sprintf()следующим образом (используя регулярные выражения, хе, это Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Теперь у вас есть:

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Не совсем основная команда, не так ли?

самом деле не предназначено для перемещения каталогов , но оно может сделать это:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

Перемещенный файл

/tmp/file

¹ какой-то код, который мы видим на *.stackexchange.*сайтах

введите описание изображения здесь

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

Это не тот путь , это просто глючит, просто чтобы объяснить, почему использовать правильный инструмент в нужный момент.

Жиль Квено
источник
+1 за sprintfинг с переименованием
Archemar
-1

mv перемещает или переименовывает файлы и каталоги и создает их резервные копии; переименовать просто переименовывает файлы.

У mv больше возможностей и опций. Посмотрите на переключатели в справочных страницах для каждого, чтобы увидеть различия в возможностях. Давайте рассмотрим использование man в Ubuntu 18.04LTS (ваш пробег может варьироваться в зависимости от версии каждого пакета):

Параметры mv (без справки и версии)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

переименовать параметры (без справки и версии)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            
K7AAY
источник
3
Определите «более мощный». Mv поддерживает регулярные выражения, такие как переименование?
Жиль Квено
Как заявил спрашивающий, нет.
K7AAY
2
Вау, что за аргумент
Жиль Квено
1
Предоставление кредита, когда кредит должен.
K7AAY