天天看点

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

好久不写blog了。。。加油,继续写blog。今天和同事讨论到一个问题,问题描述:

有文件a,a1为其硬链接,即: ln a a1

现在有文件b,对其进行以下两种操作:

1. mv b a

2. cp b a

问这两种操作对a1有何影响?

这个问题

以前还真没关注过,之前的项目的做法是对一个文件用ln old back, 然后mv back

histroy/,过一段时间若有新文件产生是进行mv new old操作并做类似的backup操作,没有想过在做mv new

old的时候是否对之前的back文件造成任何的影响(毕竟backup文件在不出问题的情况下没人去关心)。

今天做了一个实验搞明白了其中的奥秘。

1. 创建文件a 和 ln a a1

2. 创建文件b

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

3. 执行mv b a

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

可以看出a的inode变为了b的inode,而a1不变。并且a的变为b文件的内容,a1内容不变。

而且a1对应的inode的引用数变为了1。

4. 将环境重置

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

5. 执行cp b a

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

可以看出inode和引用数没有发生变化, 但是a和a1的内容变为了b的内容。

6. 执行 cp a a2

linux cp 和mv的区别,[linux]cp和mv对文件和链接影响的区别

这时可以看出a2的inode已经和a、a1不同,并且a,a1的inode和引用数都没有发生变化。

结论: mv 操作只是改变文件的inode,并没有对inode所指向的磁盘block做任何的改动。

cp操作是改变(创建)inode所指向的block(在创建时,会分配新的block)。

注:cp -i选项不在此讨论范围内。