标签 mv 下的文章

使用 mv 命令将一个文件从一个位置移动到另一个位置。

 title=

要在有图形界面的计算机上移动一个文件,你要打开该文件当前所在的文件夹,然后打开另一个窗口导航到你想把文件移到的文件夹。最后,你把文件从一个窗口拖到另一个窗口。

要在终端中移动文件,你可以使用 mv 命令将文件从一个位置移动到另一个位置。

$ mv example.txt ~/Documents

$ ls ~/Documents
example.txt

在这个例子中,你已经把 example.txt 从当前文件夹移到了主目录下的 Documents 文件夹中。

只要你知道一个文件在 哪里,又想把它移到 哪里 去,你就可以把文件从任何地方移动到任何地方,而不管你在哪里。与在一系列窗口中浏览你电脑上的所有文件夹以找到一个文件,然后打开一个新窗口到你想让该文件去的地方,再拖动该文件相比,这可以大大节省时间。

默认情况下,mv 命令完全按照它被告知的那样做:它将一个文件从一个位置移动到另一个位置。如果在目标位置已经存在一个同名的文件,它将被覆盖。为了防止文件在没有警告的情况下被覆盖,请使用 --interactive(或简写 -i)选项。

$ mv -i example.txt ~/Documents
mv: overwrite '/home/tux/Documents/example.txt'?

via: https://opensource.com/article/21/8/move-files-linux

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有时当你需要移动一个文件时,mv 命令似乎不是最佳选项,那么你会如何做呢?

不起眼的 mv 命令是在你见过的每个 POSIX 系统中都能找到的有用工具之一。它的作用是明确定义的,并且做得很好:将文件从文件系统中的一个位置移动到另一个位置。但是 Linux 非常灵活,还有其他移动文件的办法。使用不同的工具可以完美匹配一些特殊用例,这算一个小优势。

在远离 mv 之前,先看看这个命令的默认结果。首先,创建一个目录并生成一些权限为 777 的文件:

$ mkdir example
$ touch example/{foo,bar,baz}
$ for i in example/*; do ls /bin > "${i}"; done
$ chmod 777 example/*

你可能不会这么认为,但是文件在一个文件系统中作为条目存在,称为索引节点(通常称为 inode),你可以使用 ls 命令及其 --inode 选项查看一个文件占用的 inode:

$ ls --inode example/foo
7476868 example/foo

作为测试,将文件从示例目录移动到当前目录,然后查看文件的属性:

$ mv example/foo .
$ ls -l -G -g --inode
7476868 -rwxrwxrwx. 1 29545 Aug  2 07:28 foo

如你所见,原始文件及权限已经被“移动”,但它的 inode 没有变化。

这就是 mv 工具用来移动的方式:保持 inode 不变(除非文件被移动到不同的文件系统),并保留其所有权和权限。

其他工具提供了不同的选项。

复制和删除

在某些系统上,移动操作是真的在做移动:比特从文件系统中的某个位置删除并重新分配给另一个位置。这种行为在很大程度上已经失宠。现在,移动操作要么是属性重新分配(inode 现在指向文件组织中的不同位置),要么是复制和删除操作的组合。这种设计的哲学意图是确保在移动失败时,文件不会碎片化。

mv 不同,cp 命令会在文件系统中创建一个全新的数据对象,它有一个新的 inode 位置,并取决于 umask。你可以使用 cprm(如果有的话,或者 trash —— LCTT 译注:它是一个命令行回收站工具)命令来模仿 mv 命令。

$ cp example/foo .
$ ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug  2 11:58 foo
$ trash example/foo

示例中的新 foo 文件获得了 755 权限,因为此处的 umask 明确排除了写入权限。

$ umask
0002

有关 umask 的更多信息,阅读 Alex Juarez 这篇关于文件权限的文章。

查看和删除

与复制和删除类似,使用 cat(或 tac)命令在创建“移动”文件时分配不同的权限。假设当前目录中是一个没有 foo 的新测试环境:

$ cat example/foo > foo
$ ls -l -G -g --inode
7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo
$ trash example/foo

这次,创建了一个没有事先设置权限的新文件,所以文件最终权限完全取决于 umask 设置,它不会阻止用户和组的权限位(无论 umask 是什么,都不会为新文件授予可执行权限),但它会阻止其他人的写入(值为 2)。所以结果是一个权限是 664 的文件。

Rsync

rsync 命令是一个强大的多功能工具,用于在主机和文件系统位置之间发送文件。此命令有许多可用选项,包括使其目标镜像成为源。

你可以使用带有 --remove-source-files 选项的 rsync 复制,然后删除文件,并可以带上你选择执行同步的任何其他选项(常见的通用选项是 --archive):

$ rsync --archive --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo

在这里,你可以看到保留了文件权限和所有权,只是更新了时间戳,并删除了源文件。

警告:不要将此选项与 --delete 混淆,后者会从目标目录中删除(源目录中不存在的)文件。误用 --delete 会清除很多数据,建议你不要使用此选项,除非是在测试环境中。

你可以覆盖其中一些默认值,更改权限和修改设置:

$ rsync --chmod=666 --times \
    --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo

这里,目标的 umask 会生效,因此 --chmod=666 选项会产生一个权限为 644 的文件。

好处不仅仅是权限,与简单的 mv 命令相比,rsync 命令有很多有用的选项(其中最重要的是 --exclude 选项,这样你可以在一个大型移动操作中排除某些项目),这使它成为一个更强大的工具。例如,要在移动文件集合时排除所有备份文件:

$ rsync --chmod=666 --times \
    --exclude '*~' \
    --remove-source-files example/foo .

使用 install 设置权限

install 命令是一个专门面向开发人员的复制命令,主要是作为软件编译安装例程的一部分调用。它并不为用户所知(我经常想知道为什么它有这么一个直观的名字,而剩下的包管理器却只能使用缩写和昵称),但是 install 实际上是一种将文件放在你想要地方的有用方法。

install 命令有很多选项,包括 --backup--compare 命令(以避免更新文件的新副本)。

cpcat 命令不同,但与 mv 完全相同,install 命令可以在复制文件的同时而保留其时间戳:

$ install --preserve-timestamp example/foo .
$ ls -l -G -g --inode
7476869 -rwxr-xr-x. 1 29545 Aug  2 07:28 foo
$ trash example/foo

在这里,文件被复制到一个新的 inode,但它的 mtime(修改时间)没有改变。但权限被设置为 install 的默认值 755

你可以使用 install 来设置文件的权限,所有者和组:

$ install --preserve-timestamp \
    --owner=skenlon \
    --group=dialout \
    --mode=666 example/foo .
$ ls -li
7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug  2 07:28 foo
$ trash example/foo

移动、复制和删除

文件包含数据,而真正重要的文件包含你的数据。学会聪明地管理它们是很重要的,现在你有了确保以你想要的方式来处理数据的工具包。

你是否有不同的数据管理方式?在评论中告诉我们你的想法。


via: https://opensource.com/article/19/8/moving-files-linux-without-mv

作者:Seth Kenlon 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你可能已经知道,我们使用 mv 命令在类 Unix 操作系统中重命名或者移动文件和目录。 但是,mv 命令不支持一次重命名多个文件。 不用担心。 在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件。 此命令用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。

在 Linux 中一次重命名多个文件

mmv 程序可在基于 Debian 的系统的默认仓库中使用。 要想在 Debian、Ubuntu、Linux Mint 上安装它,请运行以下命令:

$ sudo apt-get install mmv

我们假设你在当前目录中有以下文件。

$ ls
a1.txt a2.txt a3.txt

现在,你想要将所有以字母 “a” 开头的文件重命名为以 “b” 开头的。 当然,你可以在几秒钟内手动执行此操作。 但是想想你是否有数百个文件想要重命名? 这是一个非常耗时的过程。 这时候 mmv 命令就很有帮助了。

要将所有以字母 “a” 开头的文件重命名为以字母 “b” 开头的,只需要运行:

$ mmv a\* b\#1

让我们检查一下文件是否都已经重命名了。

$ ls
b1.txt b2.txt b3.txt

如你所见,所有以字母 “a” 开头的文件(即 a1.txta2.txta3.txt)都重命名为 b1.txtb2.txtb3.txt

解释

在上面的例子中,第一个参数(a\*)是 “from” 模式,第二个参数是 “to” 模式(b\#1)。根据上面的例子,mmv 将查找任何以字母 “a” 开头的文件名,并根据第二个参数重命名匹配的文件,即 “to” 模式。我们可以使用通配符,例如用 *?[] 来匹配一个或多个任意字符。请注意,你必须转义使用通配符,否则它们将被 shell 扩展,mmv 将无法理解。

“to” 模式中的 #1 是通配符索引。它匹配 “from” 模式中的第一个通配符。 “to” 模式中的 #2 将匹配第二个通配符(如果有的话),依此类推。在我们的例子中,我们只有一个通配符(星号),所以我们写了一个 #1。并且,# 符号也应该被转义。此外,你也可以用引号括起模式。

你甚至可以将具有特定扩展名的所有文件重命名为其他扩展名。例如,要将当前目录中的所有 .txt 文件重命名为 .doc 文件格式,只需运行:

$ mmv \*.txt \#1.doc

这是另一个例子。 我们假设你有以下文件。

$ ls
abcd1.txt abcd2.txt abcd3.txt

你希望在当前目录下的所有文件中将第一次出现的 “abc” 替换为 “xyz”。 你会怎么做呢?

很简单。

$ mmv '*abc*' '#1xyz#2'

请注意,在上面的示例中,模式被单引号括起来了。

让我们检查下 “abc” 是否实际上被替换为 “xyz”。

$ ls
xyzd1.txt xyzd2.txt xyzd3.txt

看到没? 文件 abcd1.txtabcd2.txtabcd3.txt 已经重命名为 xyzd1.txtxyzd2.txtxyzd3.txt

mmv 命令的另一个值得注意的功能是你可以使用 -n 选项打印输出而不是重命名文件,如下所示。

$ mmv -n a\* b\#1
a1.txt -> b1.txt
a2.txt -> b2.txt
a3.txt -> b3.txt

这样,你可以在重命名文件之前简单地验证 mmv 命令实际执行的操作。

有关更多详细信息,请参阅 man 页面。

$ man mmv

更新:Thunar 文件管理器

Thunar 文件管理器默认具有内置批量重命名选项。 如果你正在使用 Thunar,那么重命名文件要比使用 mmv 命令容易得多。

Thunar 在大多数 Linux 发行版的默认仓库库中都可用。

要在基于 Arch 的系统上安装它,请运行:

$ sudo pacman -S thunar

在 RHEL、CentOS 上:

$ sudo yum install thunar

在 Fedora 上:

$ sudo dnf install thunar

在 openSUSE 上:

$ sudo zypper install thunar

在 Debian、Ubuntu、Linux Mint 上:

$ sudo apt-get install thunar

安装后,你可以从菜单或应用程序启动器中启动批量重命名程序。 要从终端启动它,请使用以下命令:

$ thunar -B

批量重命名方式如下。

单击“+”,然后选择要重命名的文件列表。 批量重命名可以重命名文件的名称、文件的后缀或者同时重命名文件的名称和后缀。 Thunar 目前支持以下批量重命名:

  • 插入日期或时间
  • 插入或覆盖
  • 编号
  • 删除字符
  • 搜索和替换
  • 大写或小写

当你从选项列表中选择其中一个条件时,你将在“新名称”列中看到更改的预览,如下面的屏幕截图所示。

选择条件后,单击“重命名文件”选项来重命名文件。

你还可以通过选择两个或更多文件从 Thunar 中打开批量重命名器。 选择文件后,按 F2 或右键单击并选择“重命名”。

嗯,这就是本次的所有内容了。希望有所帮助。更多干货即将到来。敬请关注!

祝快乐!


via: https://www.ostechnix.com/how-to-rename-multiple-files-at-once-in-linux/

作者:SK 选题:lujun9972 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

cp 和 mv 之外,在 Linux 上有更多的复制和重命名文件的命令。试试这些命令或许会惊艳到你,并能节省一些时间。

Linux 用户数十年来一直在使用简单的 cpmv 命令来复制和重命名文件。这些命令是我们大多数人首先学到的,每天可能有数百万人在使用它们。但是还有其他技术、方便的方法和另外的命令,这些提供了一些独特的选项。

首先,我们来思考为什么你想要复制一个文件。你可能需要在另一个位置使用同一个文件,或者因为你要编辑该文件而需要一个副本,并且希望确保备有便利的备份以防万一需要恢复原始文件。这样做的显而易见的方式是使用像 cp myfile myfile-orig 这样的命令。

但是,如果你想复制大量的文件,那么这个策略可能就会变得很老。更好的选择是:

  • 在开始编辑之前,使用 tar 创建所有要备份的文件的存档。
  • 使用 for 循环来使备份副本更容易。

使用 tar 的方式很简单。对于当前目录中的所有文件,你可以使用如下命令:

$ tar cf myfiles.tar *

对于一组可以用模式标识的文件,可以使用如下命令:

$ tar cf myfiles.tar *.txt

在每种情况下,最终都会生成一个 myfiles.tar 文件,其中包含目录中的所有文件或扩展名为 .txt 的所有文件。

一个简单的循环将允许你使用修改后的名称来制作备份副本:

$ for file in *
> do
> cp $file $file-orig
> done

当你备份单个文件并且该文件恰好有一个长名称时,可以依靠使用 tab 来补全文件名(在输入足够的字母以便唯一标识该文件后点击 Tab 键)并使用像这样的语法将 -orig 附加到副本的名字后。

$ cp file-with-a-very-long-name{,-orig}

然后你有一个 file-with-a-very-long-name 和一个 file-with-a-very-long-name-orig

在 Linux 上重命名文件

重命名文件的传统方法是使用 mv 命令。该命令将文件移动到不同的目录,或原地更改其名称,或者同时执行这两个操作。

$ mv myfile /tmp
$ mv myfile notmyfile
$ mv myfile /tmp/notmyfile

但我们也有 rename 命令来做重命名。使用 rename 命令的窍门是习惯它的语法,但是如果你了解一些 Perl,你可能发现它并不棘手。

有个非常有用的例子。假设你想重新命名一个目录中的文件,将所有的大写字母替换为小写字母。一般来说,你在 Unix 或 Linux 系统上找不到大量大写字母的文件,但你可以有。这里有一个简单的方法来重命名它们,而不必为它们中的每一个使用 mv 命令。 /A-Z/a-z/ 告诉 rename 命令将范围 A-Z 中的任何字母更改为 a-z 中的相应字母。

$ ls
Agenda Group.JPG MyFile
$ rename 'y/A-Z/a-z/' *
$ ls
agenda group.jpg myfile

你也可以使用 rename 来删除文件扩展名。也许你厌倦了看到带有 .txt 扩展名的文本文件。简单删除这些扩展名 —— 用一个命令。

$ ls
agenda.txt notes.txt weekly.txt
$ rename 's/.txt//' *
$ ls
agenda notes weekly

现在让我们想象一下,你改变了心意,并希望把这些扩展名改回来。没问题。只需修改命令。窍门是理解第一个斜杠前的 s 意味着“替代”。前两个斜线之间的内容是我们想要改变的东西,第二个斜线和第三个斜线之间是改变后的东西。所以,$ 表示文件名的结尾,我们将它改为 .txt

$ ls
agenda notes weekly
$ rename 's/$/.txt/' *
$ ls
agenda.txt notes.txt weekly.txt

你也可以更改文件名的其他部分。牢记 s/旧内容/新内容/ 规则。

$ ls
draft-minutes-2018-03 draft-minutes-2018-04 draft-minutes-2018-05
$ rename 's/draft/approved/' *minutes*
$ ls
approved-minutes-2018-03 approved-minutes-2018-04 approved-minutes-2018-05

在上面的例子中注意到,当我们在 s/old/new/ 中使用 s 时,我们用另一个名称替换名称的一部分。当我们使用 y 时,我们就是直译(将字符从一个范围替换为另一个范围)。

总结

现在有很多复制和重命名文件的方法。我希望其中的一些会让你在使用命令行时更愉快。


via: https://www.networkworld.com/article/3276349/linux/copying-and-renaming-files-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

熟悉了 复制命令,下一个相关的命令就是 mv 命令。当你想要将文件从一个位置移动到另一个地方并且不想复制它,那么mv 命令是完成这个任务的首选。

初识 mv 命令

mv 命令是一个与cp类似的命令,但是它并非创建文件或目录的复制品/副本。不管你在使用什么版本的Linux系统,mv 都默认安装在你的Linux系统上了。来看一下 mv 命令在日常操作中的一些例子。

1.移动文件

移动文件时需要注意的是文件的源地址和目标地址必须不同。这里有个例子,想要将file\_1.txt文件从当前目录移动到其它目录,以/home/pungki/为例,语法应该如下:

$ mv file_1.txt /home/pungki/office

mv command

如我们所见,当我们移动 file\_1.txt 文件时,先前目录的 file\_1.txt 就被删除了

2.移动多个文件

如果想一次移动多个文件,我们可以将他们放在一行并用空格分开。

$ mv file_2.txt file_3.txt file_4.txt /home/pungki/office

Move multiple files

如果你的文件有规律可循的话那么你就可以使用通配符。比如,为了移除所有以.txt为扩展名的文件,我们可以用下面的命令:

$ mv *.txt /home/pungki/office

Move using pattern

3.移动目录

不同于复制命令,用 mv 命令移动目录相当直接。移动目录你可以使用不带选项的 mv 命令。看下面的截图就一目了然了。

Moving directory

4.重命名文件或目录

我们也用 mv 命令来重命名文件或目录。不过目标位置和源位置必须相同才可以。然后文件名必须不同。

假定我们当前所在目录为/home/pungki/Documents,而我们想将file\_1.txt重命名为file\_2.txt。那么命令应该如下:

$ mv file_1.txt file_2.txt

如果是绝对路径,它应该像下面这样:

$ mv /home/pungki/Documents/file_1.txt /home/pungki/Documents/file_2.txt

Renaming file

5. 重命名目录

上一段的规则同样适用于目录。请看这个例子:

$ mv directory_1/ directory_2/

Renaming directory

6. 打印移动信息

当你移动或重命名一大堆文件或目录时,你可能会想在不去目标位置去查看的情况下知道你自己的命令是否成功地执行了。这就要用到-v选项了。

$ mv -v *.txt /home/pungki/office

mv with verbose mode

该方法同样适用于目录。

mv directory with verbose mode

7. 使用交互模式

当你将文件移动到其它位置,而那个位置恰好有同样的文件,这时 mv 命令会覆盖掉原来的文件。对于mv的这一行为一般不会有什么提示。如果想产生一个关于覆盖文件的提示,我们可以使用-i选项。(译注:通常发行版会通过alias命令,将-i作为默认选项,所以会有提示。)

假设我们想将 file\_1.txt 移动到 /home/pungki/office。同时,/home/pungki/office 目录下已经有file\_1.txt文件了。

$ mv -i file_1.txt /home/pungki/office

mv with interactive mode

这个提示会让我们知道目标位置处file\_1.txt的存在。如果我们按y键,那么那个文件将会被删除,否则不会。

8. 使用更新选项

-i 选项会提示我们关于覆盖文件的提示,而 -u 则只在源文件比目标文件新时才执行更新。让我们看一看下面的例子:

Update only newer

假如 file\_1.txt 和 file\_2.txt有如下特点:

File_1.txt has 84 bytes file size and it last modified time is 12:00
File_2.txt has 0 bytes file size and it last modified time is 11:59

我们想将它们移动到 /home/pungki/office 目录下。但是目标地址已经有file\_1.txt和file\_2.txt了。

我们用下面的命令将file\_1.txt 和file\_2.txt从当前目录移动到/home/pungki/office

$ mv -uv *.txt /home/pungki/office

可以看到这些文件被移动了。能移动这些文件是因为它们最近的修改时间戳比 /home/pungki/office 目录中的文件新。

9.不要覆盖任何已存在的文件

如果-i选项询问我们是否要覆盖文件,那么 -n 选项将不会允许我们覆盖任何已存在的文件。

继续使用第8点中的例子,如果我们将-u 换成 -n同时加上-v选项,那么我们会看到没有任何文件移动到了 /home/pungki/office 目录下。

$ mv -vn *.txt /home/pungki/office

No overwrite

10. 复制时创建备份

默认情况下,移动文件将会覆盖已存在的目标文件。但是如果我们移动错了文件而目标文件已经被新的文件覆盖了,这时应该怎么办才好呢?有没有一种方法可以恢复之前的文件呢?答案是肯定的。我们可以用-b选项。该选项会在新文件覆盖旧文件时将旧文件做备份。这里我们还以第8点为例。

$ mv -bv *.txt /home/pungki/office

Backup option

如截图中所见,在 /home/pungki/office 目录下出现了名为file\_1.txt~file\_2.txt~ 的文件。那个波浪符号(~)意味着这些文件是备份文件。从它们的属性中我们可以看到,这些文件比file\_1.txt和file\_2.txt要旧。

11. 无条件覆盖已经存在的文件

(译注:这一节是译者补充的,原文遗漏了这个重要选项)

当你希望无论如何都覆盖已经存在的文件或目录时,你可以使用 -f 选项。如果同时指定了 -f 选项和 -i 或 -n 选项,则 -f 选项会覆盖它们——即不进行任何提示而覆盖,所以,在使用此参数时,知道你在做什么。

$ mv -f *.txt /home/pungki/office

总结

移动文件和目录命令是Linux系统的基本命令。通常你可以通过man mv 或者 mv --help显示mv的手册页以了解更多详细信息。


via: http://linoxide.com/linux-command/mv-command-linux/

译者:Linchenguang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出