Bash

如何使用 bash 刪除重複文件

  • April 27, 2020

我有一個包含重複文件(在 Mac 上由md5summd5在 Mac 上))文件的文件夾,我希望安排一個cron作業來刪除任何找到的文件。

但是,我堅持如何做到這一點。到目前為止我所擁有的:

md5 -r * | sort

輸出如下:

04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg

如何根據文件的 MD5 進行處理以去除重複項?我真的不在乎我保留哪個“原件”——但我只想保留一個。

我應該以不同的方式解決這個問題嗎?

我在 Linux 上工作,這意味著md5sum輸出的命令是:

> md5sum *
d41d8cd98f00b204e9800998ecf8427e  file_1
d41d8cd98f00b204e9800998ecf8427e  file_10
d41d8cd98f00b204e9800998ecf8427e  file_2
d41d8cd98f00b204e9800998ecf8427e  file_3
d41d8cd98f00b204e9800998ecf8427e  file_4
d41d8cd98f00b204e9800998ecf8427e  file_5
d41d8cd98f00b204e9800998ecf8427e  file_6
d41d8cd98f00b204e9800998ecf8427e  file_7
d41d8cd98f00b204e9800998ecf8427e  file_8
d41d8cd98f00b204e9800998ecf8427e  file_9
b026324c6904b2a9cb4b88d6d61c81d1  other_file_1
31d30eea8d0968d6458e0ad0027c9f80  other_file_10
26ab0db90d72e28ad0ba1e22ee510510  other_file_2
6d7fce9fee471194aa8b5b6e47267f03  other_file_3
48a24b70a0b376535542b996af517398  other_file_4
1dcca23355272056f04fe8bf20edfce0  other_file_5
9ae0ea9e3c9c6e1b9b6252c8395efdc1  other_file_6
84bc3da1b3e33a18e8d5e1bdd7a18d7a  other_file_7
c30f7472766d25af1dc80b3ffc9a58c7  other_file_8
7c5aba41f53293b712fd86d08ed5b36e  other_file_9

現在使用awkxargs命令將是:

md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm

該部分使用不會匹配任何雜湊的空字元串進行awk初始化,然後檢查每一行的雜湊是否與目前文件(第二列)的雜湊(第一列)相同。如果是,它會列印出來。在每一步結束時,它將設置為目前文件的雜湊值(您可以將其限制為僅在雜湊值不同時才設置,但這應該是一件小事,尤其是在您沒有很多匹配文件的情況下)。awk 吐出的文件名被饋送到with ,它基本上呼叫了該部分給我們的內容。lasthash``lasthash``lasthash``rm``xargs``rm``awk

您可能需要先過濾目錄md5sum *

編輯:

使用 Marcins 方法,您也可以使用以下方法:

comm -1 -2 \
 <(ls) | \
 <(md5sum * | \
   sort -k1 | \
   uniq -w 32 | \
   awk '{print $2}' | \
   sort) \
xargs rm

這從文件列表ls中減去由md5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'.

引用自:https://unix.stackexchange.com/questions/192701