Gam*_*rps 9 command-line duplicate
我目前正在尝试获取一个文件(一个图像文件,例如 test1.jpg),我需要有一个该文件的所有副本(按内容)的列表。我已经尝试过,fdupes但这不允许输入文件以它的检查为基础。
TLDR:我需要一种方法来按内容列出特定文件的所有重复项。
最好通过命令行寻找解决方案,但完整的应用程序也可以。
sмu*_*urf 12
首先找到文件的 md5 哈希值:
$ md5sum path/to/file
e740926ec3fce151a68abfbdac3787aa path/to/file
Run Code Online (Sandbox Code Playgroud)
(第一行是你需要执行的命令,第二行是那个文件的md5 hash)
然后复制哈希(在您的情况下会有所不同)并将其粘贴到下一个命令中:
$ find . -type f -print0 | xargs -0 md5sum | grep e740926ec3fce151a68abfbdac3787aa
e740926ec3fce151a68abfbdac3787aa ./path/to/file
e740926ec3fce151a68abfbdac3787aa ./path/to/other/file/with/same/content
....
Run Code Online (Sandbox Code Playgroud)
如果你想花哨,你可以将这两个组合在一个命令中:
$ find . -type f -print0 | xargs -0 md5sum | grep `md5sum path/to/file | cut -d " " -f 1`
e740926ec3fce151a68abfbdac3787aa ./path/to/file
e740926ec3fce151a68abfbdac3787aa ./path/to/other/file/with/same/content
....
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以使用 sha1 或任何其他花哨的哈希。
编辑
如果用例是搜索“几个数千兆字节的 MP4 或 iso 文件”以找到“4 KB jpg”(根据@Tijn 的答案),那么指定文件大小会显着加快速度。
如果您要查找的文件大小正好是 3952 字节(您可以看到使用ls -l path/to/file该命令会执行得更快:
$ find . -type f -size 3952c -print0 | xargs -0 md5sum | grep e740926ec3fce151a68abfbdac3787aa
e740926ec3fce151a68abfbdac3787aa ./path/to/file
e740926ec3fce151a68abfbdac3787aa ./path/to/other/file/with/same/content
Run Code Online (Sandbox Code Playgroud)
请注意c大小后面的额外内容,表示字符/字节。
如果您愿意,可以将其组合在一个命令中:
FILE=./path/to/file && find . -type f -size $(du -b $FILE | cut -f1)c -print0 | xargs -0 md5sum | grep $(md5sum $FILE | cut -f1 -d " ")
Run Code Online (Sandbox Code Playgroud)
例如:
import filecmp
print filecmp.cmp('filename.png', 'filename.png')
Run Code Online (Sandbox Code Playgroud)
如果等于则打印True,否则打印 False
使用diff命令与布尔运算符&&和||
bash-4.3$ diff /etc/passwd passwd_duplicate.txt > /dev/null && echo "SAME CONTENT" || echo "CONTENT DIFFERS"
SAME CONTENT
bash-4.3$ diff /etc/passwd TESTFILE.txt > /dev/null && echo "SAME CONTENT" || echo "CONTENT DIFFERS"
CONTENT DIFFERS
Run Code Online (Sandbox Code Playgroud)
如果您想遍历特定目录中的多个文件,cd请使用for如下循环:
bash-4.3$ for file in * ; do diff /etc/passwd "$file" > /dev/null && echo "$file has same contents" || echo "$file has different contents"; done
also-waste.txt has different contents
directory_cleaner.py has different contents
dontdeletethisfile.txt has different contents
dont-delete.txt has different contents
important.txt has different contents
list.txt has different contents
neverdeletethis.txt has different contents
never-used-it.txt has different contents
passwd_dulicate.txt has same contents
Run Code Online (Sandbox Code Playgroud)
对于递归情况,使用find命令遍历目录及其所有子目录(注意引号和所有适当的斜杠):
bash-4.3$ find . -type f -exec sh -c 'diff /etc/passwd "{}" > /dev/null && echo "{} same" || echo "{} differs"' \;
./reallyimportantfile.txt differs
./dont-delete.txt differs
./directory_cleaner.py differs
./TESTFILE.txt differs
./dontdeletethisfile.txt differs
./neverdeletethis.txt differs
./important.txt differs
./passwd_dulicate.txt same
./this-can-be-deleted.txt differs
./also-waste.txt differs
./never-used-it.txt differs
./list.txt differs
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6049 次 |
| 最近记录: |