В чем разница между 'rename' и 'mv'?

Вы можете найти inode файла и каталога с помощью опции -i

ls -id /home/user/dir

Вы можете получить информацию о потребляемом inode вашей системы

df -hi

12
04.04.2019, 22:49
4 ответа

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

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

Итак, mv foo barлибо переместит файл fooв каталог bar(, если он существует ), либо переименует fooв bar(, если barне существует или не является каталог ). mv foo1 foo2 barпросто переместит оба файла в каталог barили пожалуется, если barне является каталогом.

mvвызовет функцию rename()библиотеки C для перемещения файлов, и если это не сработает (они перемещаются в другую файловую систему ), она скопирует файлы и удалит оригиналы.

Если у вас есть только mvи вы хотите переименовать несколько файлов, вам придется использовать цикл оболочки. Здесь на сайте есть ряд вопросов по этому поводу, см., например. это , это , и другие .


С другой стороны, различные renameутилиты переименовывают файлы по отдельности.

renameиз утилиты -linux , которую вы упомянули, делает простую замену строки, например. rename foo bar *изменит foobarна barbarи asdffooна asdfbar. Это не , однако принимает регулярное выражение!

Утилита переименования Perl(или ее различные экземпляры)используют выражение Perl для преобразования имен файлов. Скорее всего, будет использоваться команда s/pattern/replacement/, где шаблон является регулярным выражением.

И утилита -linux rename, и Perl rename могут использоваться для одновременного перемещения файлов в другой каталог путем внесения соответствующих изменений в имя файла, но это немного неудобно. Ни один из них не делает ничего, кроме вызова rename()для файлов, поэтому перемещение из одной файловой системы в другую не работает.

Что касается rename, то это может зависеть от вашего дистрибутива и/или того, что вы установили. Большинство из них поддерживают rename --version, поэтому используйте его, чтобы определить, какой из них у вас есть.

22
27.01.2020, 19:54

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.            
0
27.01.2020, 19:54

мв

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

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

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

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

Когда люди говорят о 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

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

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

$ 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.*веб-сайтах

enter image description here

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

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

2
27.01.2020, 19:54

mvпросто меняет имя файла (он также может переместить его в другую файловую систему или путь ). Вы даете ему старое имя и новое имя, и он изменяет файл на новое имя или местоположение.

renameиспользуется для массового изменения имен.

Допустим, у вас есть тысяча файлов с foo000.logпо foo999.log, и вы хотите изменить их на bar000.logbar999.log.

С mvвам придется делать mv foo000.log bar000.log, mv foo001 bar001.logи т. д. или же писать скрипт.

С renameвы просто делаете rename foo bar foo*.log, и вуаля, тысяча файлов изменяется в одно мгновение! Довольно круто.

Подробнее см. на странице man rename.

2
27.01.2020, 19:54

Теги

Похожие вопросы