如何在ubuntu上删除硬链接而不丢失原始文件?

如何在ubuntu上删除硬链接而不丢失原始文件?

我在 ubuntu 上并且使用dropbox.问题是我遇到一些同步问题,因为我的图片文件夹中有很多硬链接。

如何用一个简单的命令删除所有它们而不丢失任何图片?对于单个文件,我找到了以下命令

find /home -xdev -samefile "filename" | xargs rm

但我不知道如何对所有文件执行此操作?

提前谢谢

有关我的文件系统的信息:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

答案1

只要一个文件有多个硬链接,您就可以删除它,当最后一个硬链接被删除时,数据将被删除。可以使用 (*) 检索链接数量stat -c '%h' {file},因此您可以删除具有多个硬链接的所有文件,如下所示:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

正如他们所说,最终,只会有一个,幸存者将是最后一个检查的,具体取决于目录处理顺序、字母顺序等......

(*)它也出现在 的输出中ls -l,但这更难解析......

答案2

您可以删除“额外的”所有文件的副本如下:

find /home -xdev -type f -links +1 -delete

但应该注意,其中一些额外的副本可能会硬链接到外部的地方/home(并且可能看起来丢失)。

-links +1指示仅选择具有多个硬链接的find文件 ( )。-type f

您可以(需要更多工作)使用find打印每个文件的 inode 值并对结果进行排序,并(使用awk)编写要通过 删除的文件列表xargs,但这样做会遇到带有特殊字符(包括空格)的文件名的问题。但这就是如何在文件链接到外部时消除意外/home

答案3

在 Unix/Linux/MacOS 中,目录中的文件名引用 inode(间接节点),即磁盘上的结构真的是文件。名称与索引节点的这种关联称为硬链接软链接这本质上只是一个包含可以在其下找到该文件的名称的文件。如果重命名或删除链接到的文件的路径的某些部分,软链接可能会中断,而重命名/移动一个硬链接则根本不会影响其他链接。

因此,不存在“原始文件”,全部硬链接具有完全相同的状态。 inode 记录有多少个硬链接引用该文件(ls -l将此数字显示为第二个字段;对于文件,通常为 1(仅一个链接),对于目录,通常为 2(父级中的链接和目录中的“.”)目录本身;如果有子目录,则每个子目录都通过“..”引用其父目录,因此计数会增加)。当链接计数达到 0 时,回收文件使用的空间。

相关内容