bash 强制复制同一文件

bash 强制复制同一文件

我们的系统管理员创建了一个备份系统,可以创建硬盘驱动器的快照。

当我尝试从快照恢复旧版本时:

cp /path/to/snapshots/foo.bar /path/to/folder/foo.bar

我收到错误:

cp: `/path/to/snapshots/foo.bar' and  `/path/to/folder/foo.bar' are the same file. 

我可以删除该文件并复制它,但我想知道是否有办法使用 cp 来执行此操作。

我知道这些文件没有链接,因为:

  1. 我可以更改源的内容并且快照保持不变(已测试)
  2. 我可以删除源,并且可以恢复快照(已测试)
  3. 这些文件存储在大学计算集群上。如果这样的事情是真的,那么有人已经被解雇了(或者至少被吼叫了)。

尽管如此,inode文件的数量是相同的

集群是在red hat linux上实现的,我不知道文件系统是什么

df 结果:

Filesystem           1K-blocks      Used Available Use% Mounted on
<ipadress>:/vol/hpc/storage
                      67633152  67633152         0 100% /storage
<ipadress>:/vol/hpc/storage
                     2186805248 982498048 1204307200  45% /storage

统计结果:

  File: `/path/to/snapshots/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 19750461    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-22 00:03:27.246852000 +0200
Modify: 2012-01-19 23:10:32.746397000 +0200
Change: 2012-01-19 23:10:32.746397000 +0200
  File: `/path/to/folder/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 26335134    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-24 16:03:48.732453000 +0200
Modify: 2012-01-24 16:03:30.728900000 +0200
Change: 2012-01-24 16:03:30.728900000 +0200

답변1

通常,文件系统实现应该向应用程序保证,在给定机器上的任何给定时间,每个文件都可以通过其设备 ID(st_dev文件中的字段)的组合来唯一标识。stat结构)及其索引节点(字段st_ino)。设备 ID 指示该文件位于哪个已安装的文件系统上,而 inode 则表征特定文件系统内的一个文件。cp如果两个文件具有相同的设备 ID 和相同的 inode,则认为它们是相同的。

如果通过不同方式访问一个文件,则可能有多个(设备 ID、inode)对,例如通过 NFS 挂载到本地主机(这种情况往往很奇怪)。

不同的文件不应该具有相同的(设备 ID、索引节点)对。然而,这取决于文件系统的实现。如果您可以在不更改快照的情况下更改源的内容,那么我希望快照显示与源不同的设备 ID,但某些实现可能不会这样做。

请注意,除了更改文件之外,您的测试无法证明任何内容。删除一个硬链接不会删除该文件的其他名称。按需复制文件是快照的常见现象,因此只要文件内容保持一致,快照内的文件与快照外的文件完全相同就不会出现异常。索引节点号通常保持不变。

更改文件时,请确保写入同一文件,而不是在创建另一个同名文件后立即删除一个文件。

如果您确实有两个不同的文件(快照和源),它们具有相同的设备 ID 和相同的 inode,但内容不同,则大多数应用程序会认为它们是相同的。您必须找到一种取决于快照技术的文件相等性测试方法,或者对双方的内容进行校验和或系统地删除目标。

관련 정보