2008年12月23日星期二

Unix.Power.Tools:18. Linking, Renaming, and Copying Files

在当前文件夹内进行文件重命名,只是改变该目录中记录的文件名,不改变数据块,inode不变。

将文件移动到其他文件夹,比如mv dir1/foo

dir2/foo,将会删除dir1中的foo记录,并在dir2中新建foo记录,不改变数据块,inode不变。

如果是将文件移动到另一个文件系统,则需要进行数据块的拷贝。

找出当前目录名的过程:

  • 读取当前目录中 . 项对应的inode,假设为34346,这是当前目录的inode
  • 读取当前目录中 .. 项对应的inode,假设为987,这是其父目录的inode
  • 找到inode为987的数据块,读取该目录中的各项,找到inode为34346的子项对应的名字

硬链接:

  • 两个文件名指向同一个inode和相同的数据块。
  • 不能跨文件系统,不能建立目录的硬链接。
  • 硬链接与源文件inode绝对一致,硬链接不占磁盘空间。
  • 硬链接删除的时候只是将该文件inode的链接计数减1,如果减为0,文件才被真正删除。
软链接(符号链接):
  • 源文件包含实际的数据,链接包含源文件的名字,并指向源文件。
  • 软链接可以跨文件系统,也可以建立指向目录的链接。
  • 一个软链接有自己的inode,会占一点磁盘空间。
  • 软链接删除的时候不会影响源文件。但如果源文件被移动或重命名,软链接将失效。
  • 软链接在文件权限位上有个l的标记,比如lrwxrwxrwx

每个目录至少有两个链接,一个是该目录本身的 . 链接,另一个是其父目录下给出该目录名称的链接。

目录及其硬链接 . / .. 均由mkdir(2)系统调用建立。

ln file1 file2 … filen directory 可以一次将file1…filen等n个文件建链接到directory目录下。

也可以用通配符 ln file* directory。

ls –L可以看失效的符号链接,-L表示列出链接指向的文件信息而非链接本身信息。

如果是用绝对路径建符号链接,如ln /home/panll/test/a.txt
a,那么只要源文件a.txt不动,符号链接a到处移动仍可找到a.txt。

如果是用相对路径建符号链接,如cd ~/test/bin && ln ../other/a.sh
a,那么如果源文件a.sh移到别的目录,符号链接a就找不到a.sh了。但是如果是整个~/test目录移动到比如
/var/common/下,那么a与a.sh之间的链接关系仍可保持。

find . −print | rename 's/$/.old/ if −M $_ > 0.5'

cp −r /home/jim/calendar/{Sep,Oct} .

cp的时候会把软链接和硬链接会被拷成真正的文件。

cp加-p选项可以将源文件的修改时间跟权限也赋给新的拷贝文件,否则默认会将拷贝时间当作新文件的修改时间,而新文件的权限由预置的umask决定。

cp -r的时候,如果拷贝的目的路径同时出现在拷贝源路径列表中,则会陷入死循环,比如copy * backup。

采用tar进行备份:

mkdir /work/bkup/jane
cd /home/jane
tar cf − . | (cd /work/bkup/jane
&& tar xBf −)

用tar进行备份时,软链接会直接拷过去,硬链接会拷成文件,如果同一文件的硬链接多于一个,那么第一个拷成文件之后剩下的都搞成硬链接过去。

没有评论:

发表评论