大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
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桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是桌面上最直观的操作之一:
默认情况下,KDE Plasma桌面中的Dolphin文件管理器提示用户进行操作。 拖动文件时按住Shift键可强制执行移动操作:
在命令行上移动
MV 一个具有可预测语法的简单命令
mv <source> <destination>将源文件移动到指定的目标,每个目标都由
绝对或
相对文件路径定义。 如前所述,
mv是
POSIX用户的常用命令,其许多附加修饰符通常是未知的,因此,无论您是新手还是有经验的人,本文都会为您带来一些有用的修饰符。
但是,并非所有的mv命令都是由同一个人编写的,因此取决于您的操作系统,您可能拥有GNU mv ,BSD mv或Sun mv 。 命令选项因实现而异(BSD mv根本没有长选项),因此请参考您的mv手册页以查看受支持的内容,或者安装您的首选版本(这是开源的奢侈之处)。
移动文件
要使用mv将文件从一个文件夹移动到另一个文件夹,请记住语法mv <source> <destination> 。 例如,要将文件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命令默认将目标文件替换为您要移动的文件。 这种行为称为“ 破坏” ,有时正是您想要的。 其他时间不是。
某些发行版别名 mv到mv –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命令, xargs或GNU 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 中移动文件
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188403.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...