linux 中移动文件_如何在Linux中移动文件

linux 中移动文件

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

搬什么?

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

     $ ls --inode example.txt
     
7344977 example.txt

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

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

     $ mkdir foo
     
$ mv example.txt foo
     
$ ls --inode
     
7476865 foo
     
$ ls --inode foo
     
7344977 example.txt

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

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

用鼠标移动

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

Moving a file in GNOME.

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-89uHcyxG-1662537951974)(https://opensource.com/sites/default/files/uploads/kde-mv.jpg “在KDE中移动文件。”)]

在命令行上移动

MV 一个具有可预测语法的简单命令**mv **将源文件移动到指定的目标,每个目标都由绝对相对文件路径定义。 如前所述, mvPOSIX用户的常用命令,其许多附加修饰符通常是未知的,因此,无论您是新手还是有经验的人,本文都会为您带来一些有用的修饰符。

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

移动文件

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

     $ touch example.txt
     
$ mv example.txt ~/Documents
     
$ ls ~/Documents
     
example.txt

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

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

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

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

$ touch example.txt
$ mv example.txt foo2.txt
$ ls
foo2.txt

移动目录

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

     $ touch file.txt
     
$ mkdir foo_directory
     
$ mv file.txt foo_directory
     
$ mv foo_directory ~/Documents

安全地移动文件

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

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

     $ mv --interactive example.txt ~/Documents
     
mv: overwrite '~/Documents/example.txt'? 

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

     $ 
     mv 
     --no-clobber example.txt ~ 
     / Documents
     
$ 
     ls 
     
example.txt

移动备份

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

     $ mv -b example.txt ~/Documents
     
$ ls ~/Documents
     
example.txt ? ?example.txt~

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

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

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

例如:

     $ 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**文件中设置环境变量,也可以在命令前动态设置环境变量:

     $ 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**选项,因此即使它在执行备份之前创建了备份,它仍会提示您覆盖目标文件:

     $ 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** 。

     $ 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将最终目录命名为目标:

     $ mv foo bar baz ~/Documents
     
$ ls ~/Documents
     
foo ? bar ? baz

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

     $ mv foo bar baz
     
mv: target 'baz' is not a directory

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

     $ mv --target-directory=~/Documents foo bar baz
     
$ ls ~/Documents
     
foo ? bar ? baz

当从其他命令(例如find命令, xargsGNU Parallel)的输出构造mv命令时,这特别有用。

基于mtime移动

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

     $ 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

     $ 
     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 中移动文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值