如何以保存所有属性的方式在unix中移动文件

时间:2015-07-01 10:22:02

标签: unix

我今天的考试中有这个问题,我似乎无法找到答案: 如何移动放在root中的所有找到的fit文件,并以我们保存所有属性的方式将它们移动到fit目录中?

1 个答案:

答案 0 :(得分:2)

这个问题听起来有些模糊:第一个问题和直接答案是您使用cp(1)命令和--preserve=all。从联机帮助页:

  

- preserve [= ATTR_LIST]保留指定的属性(默认值:mode,ownership,timestamps),如果可能的话还有其他属性:   context,links,xattr,all

看起来你正在参加一个操作系统课程,所以我认为考试没有测试你知道cp(1)的所有可能选项的能力。问题是(可能)关于如何在代码中执行此操作(或者更确切地说,cp(1)如何执行此操作)。

以编程方式,您可以这样做:

  • 使用opendir(3)打开源目录。
  • 使用readdir(3)迭代地获取目录中的每个条目。每次调用readdir(3)都会返回struct dirent,其中包含该条目的inode,文件名和文件类型(如果文件,您可能希望递归重复该过程) type是一个目录)
  • 对于每个常规文件条目,open(2)文件为O_RDONLY。同样open(2)目标目录中的O_WRONLY | O_CREAT | O_TRUNC文件名为read(2)(只写模式,如果文件已经存在,则截断该文件,如果不存在则创建它)。
  • 照常使用write(2)fstat(2)
  • 复制内容
  • 在源文件上调用fchmod(2)以获取所有属性。
  • 在目标文件上调用st_mode,将权限设置为与源文件的stat结构的fchown(2)字段中的权限相同。
  • 在目标文件上调用st_uid,将所有者和组设置为与源文件的统计结构的st_gidfutimens(2)字段相同。
  • 在目标文件上调用st_atime,将访问和修改时间设置为与源文件的stat结构的st_mtimeclosedir(3)字段相同。
  • 关闭文件并处理下一个文件。
  • 完成后,使用+-----------+----------+-------+-------------------+ | AGENCY_ID | LOCAL_ID | CLASS | LRS_ID | +-----------+----------+-------+-------------------+ | 651 | 1 | NULL | 10200000690000001 | | 651 | 2 | NULL | 10200000690205B01 | | 651 | 3 | NULL | 10200000690293C01 | | 651 | 4 | NULL | 10200000690293D01 | +-----------+----------+-------+-------------------+ 关闭目录。

这些是您可以在副本中保留的所有属性。请注意,这两个文件之间仍然存在一些差异:

  • 无法复制ctime(上次状态更改的时间,即上次更改inode的时间)。
  • 包含该文件的设备的ID可能不同(取决于您将其复制到的位置)。
  • inode编号明显不同。
  • 硬链接的数量可能不一样。
  • 如果源文件中有漏洞,文件大小可能会有所不同。文件中的孔不一定由磁盘存储支持,但如果您从源到目标逐个字节地复制,则目标文件将没有漏洞并且需要更多磁盘空间。