• 售前

  • 售后

热门帖子
入门百科

在Linux上辨认同样内容的文件详解

[复制链接]
阿呜O 显示全部楼层 发表于 2021-10-26 13:02:13 |阅读模式 打印 上一主题 下一主题
前言
偶然文件副本相称于对硬盘空间的巨大浪费,并会在你想要更新文件时造成困扰。以下是用来识别这些文件的六个下令。
在最近的帖子中,我们看了 怎样识别并定位硬链接的文件 (即,指向同一硬盘内容并共享 inode)。在本文中,我们将检察能找到具有雷同 内容 ,却不相链接的文件的下令。
硬链接很有效是因为它们能够使文件存放在文件系统内的多个地方却不会占用额外的硬盘空间。另一方面,偶然文件副本相称于对硬盘空间的巨大浪费,在你想要更新文件时也会有造成困扰之虞。在本文中,我们将看一下多种识别这些文件的方式。
用 diff 下令比力文件

大概比力两个文件最简朴的方法是使用 diff 下令。输出会体现你文件的差异之处。 < 和 > 符号代表在当参数传过来的第一个( < )或第二个( > )文件中是否有额外的笔墨行。在这个例子中,在 backup.html 中有额外的笔墨行。
  1. $ diff index.html backup.html
  2. 2438a2439,2441
  3. > <pre>
  4. > That's all there is to report.
  5. > </pre>
复制代码
如果 diff 没有输出那代表两个文件雷同。
  1. $ diff home.html index.html
  2. $
复制代码
diff 的唯一缺点是它一次只能比力两个文件并且你必须指定用来比力的文件,这篇帖子中的一些下令可以为你找到多个重复文件。
使用校验和

cksum (checksum) 下令盘算文件的校验和。校验和是一种将笔墨内容转化成一个长数字(比方2819078353 228029)的数学简化。虽然校验和并不是完全独有的,但是文件内容差异校验和却雷同的概率微乎其微。
  1. $ cksum *.html
  2. 2819078353 228029 backup.html
  3. 4073570409 227985 home.html
  4. 4073570409 227985 index.html
复制代码
在上述示例中,你可以看到产生同样校验和的第二个和第三个文件是怎样可以被默以为雷同的。
使用 find 下令

虽然 find 下令并没有寻找重复文件的选项,它依然可以被用来通过名字或范例寻找文件并运行 cksum 下令。比方:
  1. $ find . -name "*.html" -exec cksum {} \;
  2. 4073570409 227985 ./home.html
  3. 2819078353 228029 ./backup.html
  4. 4073570409 227985 ./index.html
复制代码
使用 fslint 下令

fslint 下令可以被专程用来寻找重复文件。注意我们给了它一个起始位置。如果它必要遍历相称多的文件,这就必要花点时间来完成。注意它是怎样列出重复文件并寻找其它问题的,好比空目录和坏 ID。
  1. $ fslint .
  2. -----------------------------------file name lint
  3. -------------------------------Invalid utf8 names
  4. -----------------------------------file case lint
  5. ----------------------------------DUPlicate files  <==
  6. home.html
  7. index.html
  8. -----------------------------------Dangling links
  9. --------------------redundant characters in links
  10. ------------------------------------suspect links
  11. --------------------------------Empty Directories
  12. ./.gnupg
  13. ----------------------------------Temporary Files
  14. ----------------------duplicate/conflicting Names
  15. ------------------------------------------Bad ids
  16. -------------------------Non Stripped executables
复制代码
你大概必要在你的系统上安装 fslint 。你大概也必要将它到场你的下令搜刮路径:
  1. $ export PATH=$PATH:/usr/share/fslint/fslint
复制代码
使用 rdfind 下令

rdfind 下令也会寻找重复(雷同内容的)文件。它的名字意即“重复数据搜寻”,并且它能够基于文件日期判定哪个文件是原件——这在你选择删除副本时很有效因为它会移除较新的文件。
  1. $ rdfind ~
  2. Now scanning "/home/shark", found 12 files.
  3. Now have 12 files in total.
  4. Removed 1 files due to nonunique device and inode.
  5. Total size is 699498 bytes or 683 KiB
  6. Removed 9 files due to unique sizes from list.2 files left.
  7. Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
  8. Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
  9. Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
  10. It seems like you have 2 files that are not unique
  11. Totally, 223 KiB can be reduced.
  12. Now making results file results.txt
复制代码
你可以在 dryrun 模式中运行这个下令 (换句话说,仅仅汇报大概会别的被做出的改动)。
  1. $ rdfind -dryrun true ~
  2. (DRYRUN MODE) Now scanning "/home/shark", found 12 files.
  3. (DRYRUN MODE) Now have 12 files in total.
  4. (DRYRUN MODE) Removed 1 files due to nonunique device and inode.
  5. (DRYRUN MODE) Total size is 699352 bytes or 683 KiB
  6. Removed 9 files due to unique sizes from list.2 files left.
  7. (DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
  8. (DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
  9. (DRYRUN MODE) Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
  10. (DRYRUN MODE) It seems like you have 2 files that are not unique
  11. (DRYRUN MODE) Totally, 223 KiB can be reduced.
  12. (DRYRUN MODE) Now making results file results.txt
复制代码
rdfind 下令同样提供了类似忽略空文档( -ignoreempty )和跟踪符号链接( -followsymlinks )的功能。检察 man 页面获取表明。
  1. -ignoreempty    ignore empty files
  2. -minsize    ignore files smaller than speficied size
  3. -followsymlinks   follow symbolic links
  4. -removeidentinode  remove files referring to identical inode
  5. -checksum    identify checksum type to be used
  6. -deterministic   determiness how to sort files
  7. -makesymlinks    turn duplicate files into symbolic links
  8. -makehardlinks   replace duplicate files with hard links
  9. -makeresultsfile  create a results file in the current directory
  10. -outputname   provide name for results file
  11. -deleteduplicates  delete/unlink duplicate files
  12. -sleep     set sleep time between reading files (milliseconds)
  13. -n, -dryrun   display what would have been done, but don't do it
复制代码
注意 rdfind 下令提供了 -deleteduplicates true 的设置选项以删除副本。渴望这个下令语法上的小问题不会惹恼你。;-)
  1. $ rdfind -deleteduplicates true .
  2. ...
  3. Deleted 1 files.  <==
复制代码
你将大概必要在你的系统上安装 rdfind 下令。试验它以认识怎样使用它大概是一个好主意。
使用 fdupes 下令

fdupes 下令同样使得识别重复文件变得简朴。它同时提供了大量有效的选项——比方用来迭代的 -r 。在这个例子中,它像这样将重复文件分组到一起:
  1. $ fdupes ~
  2. /home/shs/UPGRADE
  3. /home/shs/mytwin
  4. /home/shs/lp.txt
  5. /home/shs/lp.man
  6. /home/shs/penguin.png
  7. /home/shs/penguin0.png
  8. /home/shs/hideme.png
复制代码
这是使用迭代的一个例子,注意很多重复文件是告急的(用户的 .bashrc 和 .profile 文件)并且不应被删除。
  1. # fdupes -r /home
  2. /home/shark/home.html
  3. /home/shark/index.html
  4. /home/dory/.bashrc
  5. /home/eel/.bashrc
  6. /home/nemo/.profile
  7. /home/dory/.profile
  8. /home/shark/.profile
  9. /home/nemo/tryme
  10. /home/shs/tryme
  11. /home/shs/arrow.png
  12. /home/shs/PNGs/arrow.png
  13. /home/shs/11/files_11.zip
  14. /home/shs/ERIC/file_11.zip
  15. /home/shs/penguin0.jpg
  16. /home/shs/PNGs/penguin.jpg
  17. /home/shs/PNGs/penguin0.jpg
  18. /home/shs/Sandra_rotated.png
  19. /home/shs/PNGs/Sandra_rotated.png
复制代码
fdupe 下令的很多选项列如下。使用 fdupes -h 下令或者阅读 man 页面获取详情。
  1. -r --recurse   recurse
  2. -R --recurse:  recurse through specified directories
  3. -s --symlinks  follow symlinked directories
  4. -H --hardlinks  treat hard links as duplicates
  5. -n --noempty   ignore empty files
  6. -f --omitfirst  omit the first file in each set of matches
  7. -A --nohidden  ignore hidden files
  8. -1 --sameline  list matches on a single line
  9. -S --size    show size of duplicate files
  10. -m --summarize  summarize duplicate files information
  11. -q --quiet    hide progress indicator
  12. -d --delete   prompt user for files to preserve
  13. -N --noprompt  when used with --delete, preserve the first file in set
  14. -I --immediate  delete duplicates as they are encountered
  15. -p --permissions don't soncider files with different owner/group or
  16.          permission bits as duplicates
  17. -o --order=WORD order files according to specification
  18. -i --reverse   reverse order while sorting
  19. -v --version   display fdupes version
  20. -h --help    displays help
复制代码
fdupes 下令是另一个你大概必要安装并使用一段时间才气认识其众多选项的下令。
总结

Linux 系统提供能够定位并(埋伏地)能移除重复文件的一系列的好工具,以及能让你指定搜刮地区及当对你所发现的重复文件时的处置惩罚方式的选项。
好了,以上就是这篇文章的全部内容了,渴望本文的内容对各人的学习或者工作具有肯定的参考学习价值,谢谢各人对脚本之家的支持。

via: https://www.networkworld.com/article/3390204/how-to-identify-same-content-files-on-linux.html#tk.rss_all
作者: Sandra Henry-Stocker 选题: lujun9972 译者: tomjlw 校对: wxy

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作