有时当你需要移动一个文件时,mv 命令似乎不是最佳选项,那么你会如何做呢?
-- Seth Kenlon(作者)

不起眼的 mv 命令是在你见过的每个 POSIX 系统中都能找到的有用工具之一。它的作用是明确定义的,并且做得很好:将文件从文件系统中的一个位置移动到另一个位置。但是 Linux 非常灵活,还有其他移动文件的办法。使用不同的工具可以完美匹配一些特殊用例,这算一个小优势。

在远离 mv 之前,先看看这个命令的默认结果。首先,创建一个目录并生成一些权限为 777 的文件:

$ mkdir example
$ touch example/{foo,bar,baz}
$ for i in example/*; do ls /bin > "${i}"; done
$ chmod 777 example/*

你可能不会这么认为,但是文件在一个文件系统中作为条目存在,称为索引节点(通常称为 inode),你可以使用 ls 命令及其 --inode 选项查看一个文件占用的 inode:

$ ls --inode example/foo
7476868 example/foo

作为测试,将文件从示例目录移动到当前目录,然后查看文件的属性:

$ mv example/foo .
$ ls -l -G -g --inode
7476868 -rwxrwxrwx. 1 29545 Aug  2 07:28 foo

如你所见,原始文件及权限已经被“移动”,但它的 inode 没有变化。

这就是 mv 工具用来移动的方式:保持 inode 不变(除非文件被移动到不同的文件系统),并保留其所有权和权限。

其他工具提供了不同的选项。

复制和删除

在某些系统上,移动操作是真的在做移动:比特从文件系统中的某个位置删除并重新分配给另一个位置。这种行为在很大程度上已经失宠。现在,移动操作要么是属性重新分配(inode 现在指向文件组织中的不同位置),要么是复制和删除操作的组合。这种设计的哲学意图是确保在移动失败时,文件不会碎片化。

mv 不同,cp 命令会在文件系统中创建一个全新的数据对象,它有一个新的 inode 位置,并取决于 umask。你可以使用 cprm(如果有的话,或者 trash —— LCTT 译注:它是一个命令行回收站工具)命令来模仿 mv 命令。

$ cp example/foo .
$ ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug  2 11:58 foo
$ trash example/foo

示例中的新 foo 文件获得了 755 权限,因为此处的 umask 明确排除了写入权限。

$ umask
0002

有关 umask 的更多信息,阅读 Alex Juarez 这篇关于文件权限的文章。

查看和删除

与复制和删除类似,使用 cat(或 tac)命令在创建“移动”文件时分配不同的权限。假设当前目录中是一个没有 foo 的新测试环境:

$ cat example/foo > foo
$ ls -l -G -g --inode
7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo
$ trash example/foo

这次,创建了一个没有事先设置权限的新文件,所以文件最终权限完全取决于 umask 设置,它不会阻止用户和组的权限位(无论 umask 是什么,都不会为新文件授予可执行权限),但它会阻止其他人的写入(值为 2)。所以结果是一个权限是 664 的文件。

Rsync

rsync 命令是一个强大的多功能工具,用于在主机和文件系统位置之间发送文件。此命令有许多可用选项,包括使其目标镜像成为源。

你可以使用带有 --remove-source-files 选项的 rsync 复制,然后删除文件,并可以带上你选择执行同步的任何其他选项(常见的通用选项是 --archive):

$ rsync --archive --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo

在这里,你可以看到保留了文件权限和所有权,只是更新了时间戳,并删除了源文件。

警告:不要将此选项与 --delete 混淆,后者会从目标目录中删除(源目录中不存在的)文件。误用 --delete 会清除很多数据,建议你不要使用此选项,除非是在测试环境中。

你可以覆盖其中一些默认值,更改权限和修改设置:

$ rsync --chmod=666 --times --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo

这里,目标的 umask 会生效,因此 --chmod=666 选项会产生一个权限为 644 的文件。

好处不仅仅是权限,与简单的 mv 命令相比,rsync 命令有很多有用的选项(其中最重要的是 --exclude 选项,这样你可以在一个大型移动操作中排除某些项目),这使它成为一个更强大的工具。例如,要在移动文件集合时排除所有备份文件:

$ rsync --chmod=666 --times --exclude '*~' --remove-source-files example/foo .

使用 install 设置权限

install 命令是一个专门面向开发人员的复制命令,主要是作为软件编译安装例程的一部分调用。它并不为用户所知(我经常想知道为什么它有这么一个直观的名字,而剩下的包管理器却只能使用缩写和昵称),但是 install 实际上是一种将文件放在你想要地方的有用方法。

install 命令有很多选项,包括 --backup--compare 命令(以避免更新文件的新副本)。

cpcat 命令不同,但与 mv 完全相同,install 命令可以在复制文件的同时而保留其时间戳:

$ install --preserve-timestamp example/foo .
$ ls -l -G -g --inode
7476869 -rwxr-xr-x. 1 29545 Aug  2 07:28 foo
$ trash example/foo

在这里,文件被复制到一个新的 inode,但它的 mtime(修改时间)没有改变。但权限被设置为 install的默认值 755

你可以使用 install 来设置文件的权限,所有者和组:

$ install --preserve-timestamp --owner=skenlon --group=dialout --mode=666 example/foo .
$ ls -li
7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug  2 07:28 foo
$ trash example/foo

移动、复制和删除

文件包含数据,而真正重要的文件包含你的数据。学会聪明地管理它们是很重要的,现在你有了确保以你想要的方式来处理数据的工具包。

你是否有不同的数据管理方式?在评论中告诉我们你的想法。


拷贝文件不移动_在不使用 mv 命令的情况下移动文件相关推荐

  1. pptx文件无法读取_如何在未安装Office的情况下查看PPTX,DOCX或XLSX文件中的图像...

    pptx文件无法读取 There's nothing more frustrating than finally getting the screenshot or image you asked f ...

  2. win2003无法进入桌面_救急,如何通过命令行备份桌面重要文件?

    今天要说的问题,日常使用中还蛮常见的,比如出现紧急:近期系统更新后进不了系统的一定要看!中类似的情况. 对于具有U盘启动盘的朋友们来说,这不是事,因为我们可以通过U盘启动进PE来备份数据,但是日常中, ...

  3. itmz文件如何打开_如何使用proteus8打开低版本proteus7的仿真文件?

    我们在使用proteus进行仿真的时候会遇到版本的问题,proteus8打开低版本proteus7的仿真文件就是其中之一,本文就为大家介绍如何使用proteus8打开低版本proteus7的仿真文件. ...

  4. JAVA编译成文件的说法_下列关于使用Javac命令编译后生成文件的说法中,正确的是?...

    下列关于使用Javac命令编译后生成文件的说法中,正确的是? 答:编译后生成的文件可以在Java虚拟机中运行\n\n编译后生成的文件为二进制文件\n\n编译后生成文件的后缀名为.class 线性表的链 ...

  5. java中获取文件总行数_关于java:如何以有效的方式获取文件中的行数?

    本问题已经有最佳答案,请猛点这里访问. 我有一个大文件. 它包括大约3.000-20.000行. 如何使用Java获取文件中的行总数? 从你的评论到答案来判断,你要找的词是"有效的" ...

  6. bin文件如何编辑_如何为高通固件创建rawprogram0和patch0文件

    这是一个分步教程,显示如何为Qualcomm固件创建rawprogram0.xml和patch0.xml文件. 要求 下载并安装Python @ https://www.python.org/down ...

  7. delphi 选择文件夹目录_系统小技巧:不装软件 批处理为文件夹加锁

    每个人电脑上都有一些小秘密不想让人知道,常规的方法是使用第三方加密软件进行保护.不过加密软件会占用系统资源,而且密码的记忆也让人很头疼.对于Windows 10用户,保护秘密文件可以借助系统自带的批处 ...

  8. 云视通手机下载的文件存储位置_小白版丨IPFS网络怎么存储、下载文件?怎么托管网站?...

    IPFS是一种用于文件存储的对等网络协议,采用的是基于内容的寻址,而非基于位置.这意味着要查找文件,我们不需要知道它在哪里(abc.com/cat.png),而是它包含的内容(QmSNssW5a9S3 ...

  9. ise生成msk文件的用处_修改cad图纸后怎么设置不生成bak文件及bak备份文件的用处...

    默认状态下,AutoCAD在保存的时候都会生成备份文件(*.bak),这也是CAD的一种安全保护错误,避免软件操作或保存过程中出现异常导致图形文件损坏.BAK文件就是图纸上一次保存的版本.如果图纸已经 ...

最新文章

  1. CocoaPods 原理分享及遇到的问题改进
  2. 【2017下集美大学软工1412班_助教博客】结对编程1——模块化
  3. 知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
  4. boost::geometry::correct用法的测试程序
  5. Intel硬件加速 VS CUDA完胜 视频转码感受
  6. 【AI视野·今日CV 计算机视觉论文速览 第153期】Fri, 16 Aug 2019
  7. IdentityServer4实战 - 谈谈 JWT 的安全策略
  8. 三元运算符和if else_PHP If-Else,Switch Case和速记三元运算符示例
  9. 推荐一些不错的公众号【一】
  10. 基于SSM的大学生就业信息管理系统
  11. 大学生怎样学习一门编程
  12. GLUE部分基准数据集介绍:RTE、MRPC、SST-2、QNLI、MNLI、QQP
  13. 写好软文标题的10个方式
  14. Dalvik与ART的介绍及区别(一)
  15. 多个圆通快递单号的物流信息如何在电脑上批量查询?
  16. html5禁止浏览器缩放网页大小 (实用)
  17. Python中使用表情符emoji
  18. OpenCV人脸识别之Eigenface算法(PCA特征脸方法)
  19. 神经网络算法---手写数字体识别
  20. 头歌平台Python实训答案——函数调用

热门文章

  1. 3. 机器学习中为什么需要梯度下降?梯度下降算法缺点?_浅谈随机梯度下降amp;小批量梯度下降...
  2. 60 个神级 VS Code 插件!
  3. 一个用python做的完整项目_我从一个小项目学习Python编程的全过程(二)
  4. 01背包问题从简单到复杂
  5. MEF初体验之五:Lazy Exports
  6. 线性插值法的原理和python代码实现
  7. 花神的数论题(这题...哎。数位dp咋就这么 not naive 呢)
  8. 我的Android进阶之旅------gt;Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题...
  9. Android - Animation(二)
  10. canvas制作随机验证码