linux下移动文件命令

admin 9231 2025-09-30 09:30:19

大家好,又见面了,我是你们的朋友全栈君。

linux 中移动文件

在Linux中移动文件看似比较简单,但是可用的选项却比大多数人想象的要多。 本文向初学者讲授如何在GUI和命令行中移动文件,同时还解释了幕后实际发生的情况,并介绍了许多经验丰富的用户很少探索的命令行选项。

搬什么? 在研究移动文件之前,值得仔细研究一下移动文件系统对象时实际发生的情况。 创建文件后,会将其分配给一个inode ,它是用于数据存储的文件系统中的固定点。 您可以使用ls命令将inode映射到文件:

代码语言:javascript代码运行次数:0运行复制 $ ls --inode example.txt

7344977 example.txt 移动文件时,实际上并没有将数据从一个索引节点移动到另一个索引节点,而只是给文件对象分配了新的名称或文件路径。 实际上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建它。

文件和目录索引节点从不暗示继承,而是由文件系统本身决定的。 Inode分配是基于文件创建时间的顺序分配的,并且完全独立于组织计算机的方式。 目录“内部”的文件的索引节点号可能比其父目录的索引号低,或较高。 例如:

代码语言:javascript代码运行次数:0运行复制 $ mkdir foo

$ mv example.txt foo

$ ls --inode

7476865 foo

$ ls --inode foo

7344977 example.txt 但是,将文件从一个硬盘驱动器移动到另一个硬盘驱动器时,索引节点很有可能会发生变化。 发生这种情况是因为必须将新数据写入新文件系统。 因此,在Linux中,移动和重命名文件的操作实际上是相同的操作。 无论您将文件移动到另一个目录还是使用新名称移动到同一目录,这两个操作均由同一基础程序执行。

本文重点介绍将文件从一个目录移动到另一个目录。

用鼠标移动 GUI是大多数人熟悉的友好且熟悉的抽象层,位于二进制数据的复杂集合之上。 这也是在Linux上移动文件的第一种也是最直观的方法。 如果您习惯了一般的桌面体验,那么您可能已经知道如何在硬盘驱动器上移动文件。 例如,在GNOME桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是桌面上最直观的操作之一:

默认情况下,KDE Plasma桌面中的Dolphin文件管理器提示用户进行操作。 拖动文件时按住Shift键可强制执行移动操作:

在命令行上移动 MV 一个具有可预测语法的简单命令

mv 将源文件移动到指定的目标,每个目标都由

绝对或

相对文件路径定义。 如前所述,

mv是

POSIX用户的常用命令,其许多附加修饰符通常是未知的,因此,无论您是新手还是有经验的人,本文都会为您带来一些有用的修饰符。

但是,并非所有的mv命令都是由同一个人编写的,因此取决于您的操作系统,您可能拥有GNU mv ,BSD mv或Sun mv 。 命令选项因实现而异(BSD mv根本没有长选项),因此请参考您的mv手册页以查看受支持的内容,或者安装您的首选版本(这是开源的奢侈之处)。

移动文件 要使用mv将文件从一个文件夹移动到另一个文件夹,请记住语法mv 。 例如,要将文件example.txt移到“ 文档”目录中:

代码语言:javascript代码运行次数:0运行复制 $ touch example.txt

$ mv example.txt ~/Documents

$ ls ~/Documents

example.txt 就像当您通过将文件拖放到文件夹图标上来移动文件时,此命令不会将example.txt替换为Documents 。 而是, mv检测到Documents是一个文件夹,然后将example.txt文件放入其中。

您还可以方便地在移动文件时重命名该文件:

代码语言:javascript代码运行次数:0运行复制 $ touch example.txt

$ mv example.txt ~/Documents/foo.txt

$ ls ~/Documents

foo.txt 这很重要,因为即使您不想将文件移动到另一个位置,它也可以使您重命名文件,例如:

代码语言:javascript代码运行次数:0运行复制$ touch example.txt

$ mv example.txt foo2.txt

$ ls

foo2.txt 移动目录 mv命令不会像cp一样将文件与目录区分开。 您可以使用相同的语法移动目录或文件:

代码语言:javascript代码运行次数:0运行复制 $ touch file.txt

$ mkdir foo_directory

$ mv file.txt foo_directory

$ mv foo_directory ~/Documents 安全地移动文件 如果将文件复制到已经存在相同名称文件的目录中,则mv命令默认将目标文件替换为您要移动的文件。 这种行为称为“ 破坏” ,有时正是您想要的。 其他时间不是。

某些发行版别名 mv到mv –interactive (或者您可以编写自己的 别名 ),提示您进行确认。 有些没有。 无论哪种方式,都可以使用–interactive或-i选项来确保在两个相同名称的文件发生冲突的情况下mv要求确认:

代码语言:javascript代码运行次数:0运行复制 $ mv --interactive example.txt ~/Documents

mv: overwrite '~/Documents/example.txt'? 如果不想手动干预,请使用–no-clobber或-n代替。 如果发生冲突,此标志将静默拒绝移动动作。 在此示例中, 〜/ Documents中已经存在一个名为example.txt的 文件 ,因此不会按照指示将其从当前目录移走:

代码语言:javascript代码运行次数:0运行复制 $

mv

--no-clobber example.txt ~

/ Documents

$

ls

example.txt 移动备份 如果您使用的是GNU mv ,那么备份选项提供了另一种安全的移动方式。 要创建任何有冲突的目标文件的备份,请使用-b选项:

代码语言:javascript代码运行次数:0运行复制 $ mv -b example.txt ~/Documents

$ ls ~/Documents

example.txt example.txt~ 该标志确保mv完成移动动作,但也保护目标位置中的所有先前存在的文件。

另一个GNU备份选项是–backup ,它使用一个参数定义备份文件的命名方式:

existing :如果目标中已经存在编号的备份,则将创建编号的备份。 否则,将使用简单方案。 none :即使设置了–backup,也不创建备份。 该选项对于覆盖设置备份选项的mv别名很有用。 numbered :在目标文件后面附加一个数字。 简单 :在目标文件后加上〜 ,可以使用ls的–ignore-backups选项方便地将其从您的日常视图中隐藏起来。 例如:

代码语言:javascript代码运行次数:0运行复制 $ mv --backup=numbered example.txt ~/Documents

$ ls ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt

-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~ 可以使用环境变量VERSION_CONTROL设置默认的备份方案。 您可以在〜/ .bashrc文件中设置环境变量,也可以在命令前动态设置环境变量:

代码语言:javascript代码运行次数:0运行复制 $ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents

$ ls ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt

-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~

-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~ –backup选项仍然遵循–interactive或-i选项,因此即使它在执行备份之前创建了备份,它仍会提示您覆盖目标文件:

代码语言:javascript代码运行次数:0运行复制 $ mv --backup=numbered example.txt ~/Documents

mv: overwrite '~/Documents/example.txt'? y

$ ls ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt

-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~

-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~

-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt.~3~ 您可以使用–force或-f选项覆盖-i 。

代码语言:javascript代码运行次数:0运行复制 $ mv --backup=numbered --force example.txt ~/Documents

$ ls ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:26 example.txt

-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~

-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~

-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt.~3~

-rw-rw-r--. 1 seth users 128 Aug 1 17:25 example.txt.~4~ –backup选项在BSD mv中不可用。

一次移动许多文件 移动多个文件时, mv将最终目录命名为目标:

代码语言:javascript代码运行次数:0运行复制 $ mv foo bar baz ~/Documents

$ ls ~/Documents

foo bar baz 如果最后一项不是目录,则mv返回错误:

代码语言:javascript代码运行次数:0运行复制 $ mv foo bar baz

mv: target 'baz' is not a directory GNU mv的语法相当灵活。 如果无法为mv命令提供目的地作为最后一个参数,请使用–target-directory或-t选项:

代码语言:javascript代码运行次数:0运行复制 $ mv --target-directory=~/Documents foo bar baz

$ ls ~/Documents

foo bar baz 当从其他命令(例如find命令, xargs或GNU Parallel)的输出构造mv命令时,这特别有用。

基于mtime移动 使用GNU mv ,您可以根据要移动的文件是否比要替换的目标文件新来定义移动动作。 该选项与–update或-u选项一起可用,在BSD mv中不可用:

代码语言:javascript代码运行次数:0运行复制 $ ls -l ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:32 example.txt

$ ls -l

-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt

$ mv --update example.txt ~/Documents

$ ls -l ~/Documents

-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt

$ ls -l 此结果仅基于文件的修改时间,而不是基于两个文件的差异,因此请谨慎使用。 仅通过触摸命令就可以欺骗mv :

代码语言:javascript代码运行次数:0运行复制 $

cat example.txt

one

$

cat ~

/ Documents

/ example.txt

one

two

$

touch example.txt

$

mv

--update example.txt ~

/ Documents

$

cat ~

/ Documents

/ example.txt

one 显然,这不是可用的最智能的更新功能,但是它提供了防止覆盖最新数据的基本保护。

移动 除了mv命令外,还有更多移动数据的方法,但是作为作业的默认程序, mv是一个很好的通用选项。 既然您知道可以使用的选项,则可以比以前更聪明地使用mv 。

翻译自: https://opensource.com/article/19/8/moving-files-linux-depth

linux 中移动文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

上一篇
下一篇
相关文章