当前位置: 首页 > 科技观察

不使用mv命令移动文件

时间:2023-03-14 14:39:08 科技观察

有时当您需要移动文件时,mv命令似乎不是最佳选择,那么您如何操作呢?不起眼的mv命令是您见过的每个POSIX系统中的有用工具之一。它的作用定义明确,而且做得很好:将文件从文件系统中的一个位置移动到另一个位置。但是Linux非常灵活,还有其他方法可以移动文件。使用不同的工具可以完美匹配一些特殊的用例,这是一个小小的优势。在离开mv之前,先看看这个命令的默认结果。首先,创建一个目录并生成一些权限为777的文件:$mkdirexample$touchexample/{foo,bar,baz}$foriinexample/*;执行ls/bin>"${i}";done$chmod777example/*你可能不这么认为,但文件作为条目存在于文件系统中,称为索引节点(通常称为inode),你可以使用ls命令及其--inode选项来查看文件是什么占用inode:$ls--inodeexample/foo7476868example/foo作为测试,将文件从example目录移动到当前目录,然后查看文件的属性:$mvexample/foo.$ls-l-G-g--inode7476868-rwxrwxrwx。129545Aug207:28foo如您所见,原始文件及其权限已被“移动”,但其inode并未更改。这就是使用mv工具移动的方式:保持inode不变(除非文件被移动到不同的文件系统),并保留其所有权和权限。其他工具提供不同的选项。复制和删除在某些系统上,移动操作实际上就是移动:位从文件系统中的一个位置删除并重新分配给另一个位置。这种行为在很大程度上已经失宠。现在,移动操作要么是属性重新分配(inode现在指向文件组织中的不同位置),要么是复制和删除操作的组合。这种设计的哲学意图是确保在移动失败时文件不会碎片化。与mv不同,cp命令在文件系统中创建一个全新的数据对象,它有一个新的inode位置并依赖于umask。您可以使用cp和rm(或trash,如果可用)命令来模仿mv命令。$cp示例/foo.$ls-l-G-g--inode7476869-rwxrwxr-x。29545Aug211:58foo$trashexample/foo示例中的新foo文件获得755权限,因为这里的umask写权限被明确排除。$umask0002有关umask的更多信息,请阅读AlexJuarez关于文件权限的文章。查看和删除类似于复制和删除,在创建“移动”文件时使用cat(或tac)命令分配不同的权限。假设当前目录中没有foo的新测试环境:$catexample/foo>foo$ls-l-G-g--inode7476869-rw-rw-r--。29545Aug812:21foo$trashexample/foo这一次,创建了一个没有预先设置权限的新文件,所以文件的最终权限完全取决于umask设置,它不会阻止用户和组权限位(无论umask是什么,新文件都不会被授予执行权限),但它会阻止其他人写入(值2)。所以结果是一个权限为664的文件。Rsyncrsync命令是一个功能强大且用途广泛的工具,用于在主机和文件系统位置之间发送文件。此命令有许多可用选项,包括将其目标图像设为源图像。您可以使用带有--remove-source-files选项的rsync复制然后删除文件,并且可以选择使用您选择的任何其他选项来执行同步(常见的通用选项是--archive):$rsync--archive--删除源文件example/foo.$lsexamplebarbaz$ls-lGgi7476870-rwxrwxrwx。1sethusers29545Aug812:23foo在这里您可以看到文件权限和所有权得到保留,只是更新了时间戳,并删除了源文件。警告:不要将此选项与--delete混淆,后者会从目标目录中删除文件(源目录中不存在的文件)。误用--delete会清除很多数据,建议大家不要使用这个选项,测试环境除外。您可以覆盖其中一些默认值、更改权限和修改设置:$rsync--chmod=666--times\--remove-source-filesexample/foo.$lsexamplebarbaz$ls-lGgi7476871-rw-rw-r--.1sethusers29545Aug812:55foo在这里,目标的umask将生效,因此--chmod=666选项将生成一个权限为644的文件。好处不止于权限,rsync命令有很多有用的选项与简单的mv命令(其中最重要的是--exclude选项,因此您可以在大型移动操作中排除某些项目)相比,这使它成为一个更强大的工具。例如,在移动文件集合时排除所有备份文件:$rsync--chmod=666--times\--exclude'*~'\--remove-source-filesexample/foo。使用install设置权限install命令是开发人员特定的复制命令,主要作为软件编译和安装例程的一部分调用。它不为用户所知(我经常想知道为什么它有这么一个直观的名字,而其余的包管理器仅限于缩写和昵称),但install实际上是一种将文件放在有用的方式来请求一个地方。install命令有很多选项,包括--backup和--compare命令(以避免更新文件的新副本)。与cp和cat命令不同,但与mv完全一样,install命令可以在复制文件的同时保留它们的时间戳:$install--preserve-timestampexample/foo.$ls-l-G-g--inode7476869-rwxr-xr-X。129545Aug207:28foo$trashexample/foo这里,文件被复制到一个新的inode,但它的mtime(修改时间)没有改变。但权限设置为安装的默认值755。您可以使用install设置文件权限、所有者和组:$install--preserve-timestamp\--owner=skenlon\--group=dialout\--mode=666example/foo.$ls-li7476869-rw-rw-rw-。1skenlondialout29545Aug207:28foo$trashexample/foo移动、复制和删除文件包含数据,真正重要的文件包含您的数据。学会智能地管理它们很重要,现在您有了工具包来确保您的数据按照您想要的方式进行处理。