MV

MV

我并不完全清楚,但是mvand rename(来自util-linux-ng 2.17.2as /usr/bin/rename)之间有什么区别?除了rename接受正则表达式和mv不接受正则表达式之外,其中一种相对于另一种是否还有其他优点?我相信rename还可以一次处理多个文件重命名,但mv不这样做。

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

答案1

两者基本上都是盖子上写的内容。

mv是一个标准实用程序移动将一个或多个文件发送到给定目标。如果只有一个文件要移动,它可用于重命名文件。如果有多个,则mv仅当目标是目录时才有效,并将文件移动到那里。

因此,mv foo bar要么将文件移动foo到目录bar(如果存在),要么重命名foobar(如果bar不存在或不是目录)。mv foo1 foo2 bar只会将两个文件移动到目录bar,或者如果bar不是目录则会发出警报。

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

如果您拥有的mv只是重命名多个文件,则必须使用 shell 循环。网站上有很多关于这方面的问题,请参见例如,,和别的


另一方面,各种rename公用事业改名文件,单独。

来自renameutil-linux您提到的内容进行了简单的字符串替换,例如rename foo bar *将更foobar改为barbar,asdffooasdfbar确实如此不是但是,请使用正则表达式!

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

util-linux重命名和Perl重命名都可以用来同时将文件移动到另一个目录,通过对文件名进行适当的更改,但这有点尴尬。两者都只是调用rename()文件,因此从一个文件系统移动到另一个文件系统不起作用。

至于rename你有哪一个,它可能取决于您的发行版和/或您已安装的内容。他们中的大多数人都支持rename --version,因此请使用它来确定您拥有哪一个。

答案2

mv只需更改文件的名称(也可以将其移动到另一个文件系统或路径)。您为其指定一个旧名称和一个新名称,它会将文件更改为新名称或新位置。

rename用于进行批量命名更改。

假设您有 1000 个文件foo000.logthrough ,foo999.log并且您想将它们更改为bar000.logthrough bar999.log

mv必须这样做mv foo000.log bar000.logmv foo001 bar001.log等等,否则就写一个脚本。

只需rename您简单地做一下rename foo bar foo*.log,瞧,一千个文件立即被更改!很酷。

再次查看该man rename页面以了解详细信息。

答案3

MV

这是一个基本的命令行,旨在做一件事并做好它(Unix 哲学):移动文件或目录

您可以破解STDOUT& STDIN¹ 来动态修改目标字符串,但这只是不是聪明的黑客

重命名(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

这不是该走的路,这是明显的错误,只是为了解释为什么要在正确的时刻使用正确的工具

答案4

MV移动或重命名文件和目录并备份它们;改名只是重命名文件。

MV拥有更多的功能和选择。查看每个开关的手册页,了解功能上的差异。让我们看一下使用男人在 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.            

相关内容