无论您是在Linux中移动文件的新手还是经验丰富的人,都可以在这篇深入的文章中学到一些东西。在Linux中移动文件似乎很简单,但可用的选项比大多数人意识到的要多。本文介绍初学者如何在GUI和命令行中移动文件。它还解释了幕后实际发生的事情,并介绍了许多即使是有经验的用户也很少使用的命令行选项。搬什么?在查看移动文件之前,有必要仔细看看移动文件系统对象时实际发生的情况。当一个文件被创建时,它被分配给一个索引节点,它是文件系统中用于数据存储的固定点。可以使用ls命令查看文件对应的inode:$ls--inodeexample.txt7344977example.txt当你移动一个文件时,实际上并没有将数据从一个inode移动到另一个inode,你只是分配了文件对象只是一个新名称或文件路径。事实上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建它们。(LCTT译注:移动文件不跨卷、跨分区、跨存储时不重新创建文件;反之亦然)文件和目录的inode并不隐含这种继承关系,而是由文件系统本身决定的。inode的分配基于文件的创建顺序,完全独立于您组织计算机文件的方式。目录“内部”的文件可能具有比其父目录更低或更高的inode编号。例如:$mkdirfoo$mvexample.txtfoo$ls--inode7476865foo$ls--inodefoo7344977example.txt但是,当您将文件从一个硬盘移动到另一个硬盘时,inode基本上发生了变化。发生这种情况是因为必须将新数据写入新文件系统。因此,在Linux中,移动和重命名文件的操作实际上是同一个操作。无论您将文件移动到另一个目录还是在同一目录中使用新名称,这两种操作都由相同的底层程序执行。本文重点介绍将文件从一个目录移动到另一个目录。使用鼠标GUI移动文件是大多数人都熟悉的友好抽象层,位于复杂的二进制数据集合之上。这也是在Linux桌面上移动文件的首选方法,也是最直观的方法。一般而言,如果您习惯使用台式计算机,那么您可能已经知道如何在硬盘上移动文件。例如,在GNOME桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制它,因此这可能是该桌面上最直观的操作之一:将文件移动到侏儒。KDEPlasma桌面中的Dolphin文件管理器默认提示用户执行不同的操作。拖动文件时按住Shift键以强制移动:在KDE中移动文件。在命令行上移动文件在Linux、BSD、Illumos、Solaris和MacOS上移动文件的shell命令是mv。不言自明,简单的命令mv会将源文件移动到指定的目标,源和目标都由绝对或相对文件路径定义。如前所述,mv是POSIX用户的常用命令,带有许多鲜为人知的附加选项,因此无论您是新手还是老手,本文都会为您带来一些有用的选项。但是,并非所有mv命令都是由同一个人编写的,因此根据您的操作系统,您可能使用GNUmv、BSDmv或Sunmv。该命令的选项因实现而异(BSDmv根本没有长选项),因此请参阅您的mv手册页以查看支持的内容,或安装您喜欢的版本(这是开源的奢侈)。移动文件要使用mv将文件从一个文件夹移动到另一个文件夹,请记住语法mv。例如,要将文件example.txt移动到您的文档目录中:此命令不会用example.txt替换文档。相反,mv检测到Documents是一个文件夹,并将example.txt文件放入其中。您还可以在移动文件时方便地重命名该文件:$touchexample.txt$mvexample.txt~/Documents/foo.txt$ls~/Documentsfoo.txt这很重要,因此您不必将文件移动到另一个位置,也可以重命名文件,例如:$touchexample.txt$mvexample.txtfoo2.txt$lsfoo2.txt`移动目录与cp命令不同,mv命令对待文件和目录没有区别,你可以使用相同的格式移动目录或文件:$touchfile.txt$mkdirfoo_directory$mvfile.txtfoo_directory$mvfoo_directory~/Documents安全地移动文件如果将文件移动到已经有相同文件的地方名称,默认情况下,mv会将目标文件替换为您移动的文件。这种行为被称为破坏,有时它是你想要的,有时它不是。有些发行版将mv别名定义为mv--interactive(你也可以自己写),这会提示你确认是否覆盖。其他一些发行版不这样做,因此您可以使用--interactive或-i选项来确保当两个同名文件发生冲突时mv会要求您确认。$mv--interactiveexample.txt~/Documentsmv:覆盖'~/Documents/example.txt'?如果您不想手动干预,请使用--no-clobber或-n。当发生冲突时,此选项会默默地拒绝移动操作。在此示例中,名为example.txt的文件存在于~/Documents中,因此不会按照命令要求将其从当前目录中删除。$mv--no-clobberexample.txt~/Documents$lsexample.txt用备份移动如果你使用GNUmv,有一个备份选项提供了另一种安全移动的方法。要创建任何冲突目标文件的备份文件,可以使用-b选项。$mv-bexample.txt~/Documents$ls~/Documentsexample.txtexample.txt~此选项确保mv完成移动,但也保护目录位置中的现有文件。另一个GNU备份选项是--backup,它接受一个定义备份文件命名方式的参数。existing:如果目标位置已经存在带编号的备份文件,则创建带编号的备份。否则,使用简单方法。none:即使设置了--backup,也不会创建备份。当mv与备份选项别名时,此选项会覆盖此行为。编号:将数字附加到目标文件名。简单:将~附加到目标文件,当您经常使用带有--ignore-backups选项的ls时,可以方便地隐藏这些文件。简单来说:$mv--backup=numberedexample.txt~/Documents$ls~/Documents-rw-rw-r--。1seth用户128Aug117:23example.txt-rw-rw-r--。1sethusers128Aug117:20example.txt.~1~您可以使用环境变量VERSION_CONTROL来设置默认备份方案。您可以在~/.bashrc文件中设置此环境变量,也可以在命令之前动态设置它:$VERSION_CONTROL=numberedmv--backupexample.txt~/Documents$ls~/Documents-rw-rw-r--.1sethusers128Aug117:23example.txt-rw-rw-r--。1seth用户128Aug117:20example.txt.~1~-rw-rw-r--。Aug117:22example.txt.~2~--backup选项仍然遵循--interactive或-i选项,因此即使它在执行之前创建了备份,它仍然会提示您覆盖目标文件:$mv--backup=numberedexample.txt~/Documentsmv:覆盖'~/Documents/example.txt'?y$ls~/Documents-rw-rw-r--.1sethusers128Aug117:24example.txt-rw-rw-r--。1seth用户128Aug117:20example.txt.~1~-rw-rw-r--。1sethusers128Aug117:22example.txt.~2~-rw-rw-r--.1sethusers128Aug117:23example.txt.~3~您可以使用--force或-f选项覆盖-i。$mv--backup=numbered--forceexample.txt~/Documents$ls~/Documents-rw-rw-r--。1sethusers128Aug117:26example.txt-rw-rw-r--。1seth用户128Aug117:20example.txt.~1~-rw-rw-r--。1seth用户128Aug117:22example.txt.~2~-rw-rw-r--.1seth用户128Aug117:24example.txt.~3~-rw-rw-r--.1sethusers128Aug117:25example.txt.~4~--BSDmv中的备份选项不可用。一次移动多个文件当移动多个文件时,mv将最终目录视为目标:$mvfoobarbaz~/Documents$ls~/Documentsfoobarbaz如果最后一项不是目录,mv返回错误:$mvfoobarbazmv:target'baz'isnotadirectoryGNUmv的语法非常灵活。如果您不能提供目标目录作为mv命令的最后一个参数,请使用--target-directory或-t选项:$mv--target-directory=~/Documentsfoobarbaz$ls~/Documentsfoobarbaz当从某个其他命令(例如find命令、xargs或GNUParallel)的输出构建mv命令时,这尤其有用。基于修改时间移动使用GNUmv,您可以根据被移动的文件是否比被替换的文件新来定义移动动作。此方法可与--update或-u选项一起使用,在BSDmv中不可用:$ls-l~/Documents-rw-rw-r--。1seth用户128Aug117:32example.txt$ls-l-rw-rw-r--。1seth用户128Aug117:42example.txt$mv--updateexample.txt~/Documents$ls-l~/Documents-rw-rw-r--。1sethusers128Aug117:42example.txt$ls-l这个结果只是根据文件的修改时间,不是两个文件的区别,所以谨慎使用。只需使用touch命令来欺骗mv:$catexample.txtone$cat~/Documents/example.txtonetwo$touchexample.txt$mv--updateexample.txt~/Documents$cat~/Documents/example.txtone显然,这不是最智能的更新功能,但它提供了基本的保护,防止覆盖最新数据。移动移动数据的方法比mv命令多,但作为此任务的默认程序,mv是一个不错的通用选择。现在您知道了哪些选项可用,您可以比以前更智能地使用mv。