我并不完全清楚,但是mv
and rename
(来自util-linux-ng 2.17.2
as /usr/bin/rename
)之间有什么区别?除了rename
接受正则表达式和mv
不接受正则表达式之外,其中一种相对于另一种是否还有其他优点?我相信rename
还可以一次处理多个文件重命名,但mv
不这样做。
我在他们的页面中找不到明确的指示,man
或者通过我自己的一些调查,还有什么使他们与众不同。
答案1
两者基本上都是盖子上写的内容。
mv
是一个标准实用程序到移动将一个或多个文件发送到给定目标。如果只有一个文件要移动,它可用于重命名文件。如果有多个,则mv
仅当目标是目录时才有效,并将文件移动到那里。
因此,mv foo bar
要么将文件移动foo
到目录bar
(如果存在),要么重命名foo
为bar
(如果bar
不存在或不是目录)。mv foo1 foo2 bar
只会将两个文件移动到目录bar
,或者如果bar
不是目录则会发出警报。
mv
将调用rename()
C 库函数来移动文件,如果这不起作用(它们被移动到另一个文件系统),它将复制文件并删除原始文件。
如果您拥有的mv
只是重命名多个文件,则必须使用 shell 循环。网站上有很多关于这方面的问题,请参见例如这,这,和别的。
另一方面,各种rename
公用事业改名文件,单独。
来自rename
util-linux您提到的内容进行了简单的字符串替换,例如rename foo bar *
将更foobar
改为barbar
,asdffoo
和asdfbar
。确实如此不是但是,请使用正则表达式!
Perl 重命名实用程序(或它的各种实例) 采用 Perl 表达式来转换文件名。人们很可能会使用一个命令,其中s/pattern/replacement/
图案 是一个正则表达式。
util-linux重命名和Perl重命名都可以用来同时将文件移动到另一个目录,通过对文件名进行适当的更改,但这有点尴尬。两者都只是调用rename()
文件,因此从一个文件系统移动到另一个文件系统不起作用。
至于rename
你有哪一个,它可能取决于您的发行版和/或您已安装的内容。他们中的大多数人都支持rename --version
,因此请使用它来确定您拥有哪一个。
答案2
mv
只需更改文件的名称(也可以将其移动到另一个文件系统或路径)。您为其指定一个旧名称和一个新名称,它会将文件更改为新名称或新位置。
rename
用于进行批量命名更改。
假设您有 1000 个文件foo000.log
through ,foo999.log
并且您想将它们更改为bar000.log
through bar999.log
。
你mv
必须这样做mv foo000.log bar000.log
,mv 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.