'rename'和'mv'有什么区别?


12

对我来说还不是很清楚,但是mvand rename(从util-linux-ng 2.17.2as /usr/bin/rename)之间有什么区别?除了rename接受正则表达式之外,还有其他优点mv吗?我相信rename也可以一次处理多个文件重命名,mv而不会这样做。

我无法在他们的man页面中找到明确的指示,还有什么使他们与众不同或通过我自己进行的调查。


2
让我们确保我们在谈论同样的事情。type -a rename和的输出是rename --version什么?
Jeff Schaller

@JeffSchaller它的更多的是好奇我的一部分,但在我的* nix的机器之一,我得到rename is /usr/bin/renamerename (util-linux-ng 2.17.2)分别。
Urda

6
这里有一些不同的重命名,它可能是别名/函数/脚本,所以我只想确保我们知道它是什么。谢谢!请随时将这些输出编辑到您的问题中。
Jeff Schaller

@JeffSchaller不用担心,实际上这个链接是我刚刚发现的,它告诉我rename在不同发行版中可以表达不同的意思。
Urda

5
您的问题似乎包含答案。“喷气式飞机和三轮车之间有什么区别,除了喷气式飞机可以飞行而且可以更快地飞行数千倍之外?” :-)⁠
G-人说“恢复Monica的

Answers:


21

对于两个人来说,这基本上就是盖子上说的话。

mv是一个标准的工具移动一个或多个文件,以给定的目标。如果仅要移动一个文件,则可用于重命名文件。如果有多个mv目录,则仅在目标是目录并将文件移到该目录的情况下才有效。

因此,mv foo bar可以将文件移动foo到目录bar(如果存在),或者重命名foobar(如果bar不存在或不是目录)。mv foo1 foo2 bar只会将两个文件都移到directory bar,或者如果bar不是目录则抱怨。

mv将调用rename()C库函数来移动文件,如果不起作用(将它们移动到另一个文件系统),它将复制文件并删除原始文件。

如果只有全部,mv并且要重命名多个文件,则必须使用Shell循环。有许多对这里的网站上的问题,例如见这个这个和其他人


另一方面,各种rename实用程序分别重命名文件。

rename从UTIL Linux的其中你提到做一个简单的字符串替换,如rename foo bar *将改变foobarbarbar,并asdffooasdfbar它并没有,但是,采取一个正则表达式!

Perl重命名实用程序或其各种实例)采用Perl表达式来转换文件名。人们很可能会使用一条命令,其中模式一个正则表达式。s/pattern/replacement/

通过对文件名进行适当的更改,可以使用util-linux重命名和Perl重命名将文件同时移动到另一个目录,但这有点尴尬。除了调用rename()文件外,其他操作都不多,因此从一个文件系统移至另一个文件系统是行不通的。

至于rename您拥有的,可能取决于您的发行版和/或您已安装的内容。他们中的大多数人都支持rename --version,所以用它来识别您拥有的那个。


不仅是“正则表达式”,还可以在需要时起作用
Gilles Quenot

@GillesQuenot,好吧,可以,例如,rename '$_=lc' *将小写的文件名。但是我认为最常见的情况是使用s///(我提到过),并且其中的模式部分是正则表达式;我认为您不能在那里使用函数。不过,您可以在替换零件中完成此操作。
ilkkachu

@MyWrathAcademia,手册页中的第一个示例对我有用(它所做的与其他示例有所不同)。另外,我链接到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.logmv foo001 bar001.log等要不然写一个脚本。随着rename你只需做rename foo bar foo*.log,瞧,一千个文件都在瞬间改变了!很酷 man rename再次查看该页面以获取详细信息。


2

MV

这是一个基本的命令行,旨在做一件事情并且做得很好(Unix理念):移动文件或目录

您可以hack STDOUTSTDIN¹即时修改目标字符串,但这并不是明智的选择

重命名(Perl的)

警告 还有其他相同名称的工具可能无法执行此操作,因此请小心。

当人们谈论时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

这不是要走的路,它是普通的越野车,只是为了解释为什么在正确的时间使用正确的工具


sprintf重命名ing +1
Archemar

-1

mv移动或重命名文件和目录,并将其备份;重命名只是重命名文件。

mv具有更多功能和选项。查看每个手册页中的开关,以了解功能上的差异。让我们看一下在Ubuntu 18.04LTS中使用man的人(您的里程可能因每个软件包的版本而异):

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.            

3
定义“更强大”。MV是否支持像rename这样的正则表达式?
吉尔斯·奎诺

正如提问者所说,不。
K7AAY

2
哇,
真是

1
在应收信贷的地方提供信贷。
K7AAY
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.