bash脚本列出重复的哈希文件

时间:2017-11-19 17:38:31

标签: bash hash

我想创建一个bash脚本,在给定目录中搜​​索要复制的图片。图片的名称格式为IMG_ \ d \ d \ d \ d.JPG。如果图片具有重复的文件名,则将它们复制到/ images / archives并将.JPG附加到其名称的末尾,因此副本具有.JPG.JPG。还有重复的图片,所以我想散列每张图片并检查它是否是重复的图片。如果它是重复的图片,则不要将副本复制到/ archives中,而是将重复的文件路径存储到名为output.txt的文件中。

我正在努力尝试获取重复的哈希值以显示文件名。这是我到目前为止所做的:

    if [ -d $1 ]
then echo using directory $1 as source
else echo Sorry, not a valid drive
exit
fi
if [  -d $2 ]
then echo $2 target location already exists
else mkdir -p $2 
fi
cd $1
myList=`find . -mindepth 1 -type f -name "*MG_[0-9][0-9][0-9][0-9].JPG"`
echo $myList
ImagesToCopy=`find . -mindepth 1 -type f -name "*MG_[0-9][0-9][0-9][0-9].JPG" -exec md5sum {} \; | cut -f1 -d" " | sort | uniq`
echo $ImagesToCopy

这给了我一份我需要复制的文件及其哈希值的列表。如果我输入命令,在命令行中:

# find . -mindepth 1 -type f -name "*MG_[0-9][0-9][0-9][0-9].JPG" -exec md5sum {} \; | sort | cut -f1 -d" "| uniq -d

我收到了结果:

266ab54fd8a6dbc7ba61a0ee526763e5
88761da2c2a0e57d8aab5327a1bb82a9
cc640e50f69020dd5d2d4600e20524ac

这是我不想复制的重复文件列表,但我想在此旁边显示文件路径和文件名,如下所示:

    # find . -mindepth 1 -type f -name "*MG_[0-9][0-9][0-9][0-9].JPG" -exec md5sum {} \; | sort -k1 | uniq -u
043007387f39f19b3418fcba67b8efda  ./IMG_1597.JPG
05f0c10c49983f8cde37d65ee5790a9f  ./images/IMG_2012/IMG_2102.JPG
077c22bed5e0d0fba9e666064105dc72  ./DCIM/IMG_0042.JPG
1a2764a21238aaa1e28ea6325cbf00c2  ./images/IMG_2012/IMG_1403.JPG
1e343279cd05e8dbf371331314e3a2f6  ./images/IMG_1959.JPG
2226e652bf5e3ca3fbc63f3ac169c58b  ./images/IMG_0058.JPG
266ab54fd8a6dbc7ba61a0ee526763e5  ./images/IMG_0079.JPG
266ab54fd8a6dbc7ba61a0ee526763e5  ./images/IMG_2012/IMG_0079.JPG
2816dbcff1caf70aecdbeb934897fd6e  ./images/IMG_1233.JPG
451110cc2aff1531e64f441d253b7fec  ./DCIM/103canon/IMG_0039.JPG
45a00293c0837f10e9ec2bfd96edde9f  ./DCIM/103canon/IMG_0097.JPG
486f9dd9ee20ba201f0fd9a23c8e7289  ./images/IMG_2013/IMG_0060.JPG
4c2054c57a2ca71d65f92caf49721b4e  ./DCIM/IMG_1810.JPG
53313e144725be3993b1d208c7064ef6  ./IMG_2288.JPG
5ac56dcddd7e0fd464f9b243213770f5  ./images/IMG_2012/favs/IMG_0039.JPG
65b15ebd20655fae29f0d2cf98588fc3  ./DCIM/IMG_2564.JPG
88761da2c2a0e57d8aab5327a1bb82a9  ./images/IMG_2012/favs/IMG_1729.JPG
88761da2c2a0e57d8aab5327a1bb82a9  ./images/IMG_2013/IMG_1729.JPG
8fc75b0dd2806d5b4b2545aa89618eb6  ./DCIM/103canon/IMG_2317.JPG
971f0a4a064bb1a2517af6c058dc3eb3  ./images/IMG_2012/favs/IMG_2317.JPG
aad617065e46f97d97bd79d72708ec10  ./images/IMG_2013/IMG_1311.JPG
c937509b5deaaee62db0bf137bc77366  ./DCIM/IMG_1152.JPG
cc640e50f69020dd5d2d4600e20524ac  ./images/IMG_2012/favs/IMG_2013.JPG
cc640e50f69020dd5d2d4600e20524ac  ./images/IMG_2013/IMG_2013.JPG
d8edfcc3f9f322ae5193e14b5f645368  ./images/IMG_2012/favs/IMG_1060.JPG
dcc1da7daeb8507f798e4017149356c5  ./DCIM/103canon/IMG_1600.JPG
ded2f32c88796f40f080907d7402eb44  ./IMG_0085.JPG

提前致谢。

1 个答案:

答案 0 :(得分:1)

假设您的结果为md5sum。例如:

$ cat file
266ab54fd8a6dbc7ba61a0ee526763e5 /path/to/file1a
88761da2c2a0e57d8aab5327a1bb82a9 /path/to/file2a
266ab54fd8a6dbc7ba61a0ee526763e5 /path/to/file1b
cc640e50f69020dd5d2d4600e20524ac /path/to/file3
88761da2c2a0e57d8aab5327a1bb82a9 /path/to/file2b

要从列表中删除重复项,请使用awk:

$ awk '!($1 in a){a[$1]; print}' file
266ab54fd8a6dbc7ba61a0ee526763e5 /path/to/file1a
88761da2c2a0e57d8aab5327a1bb82a9 /path/to/file2a
cc640e50f69020dd5d2d4600e20524ac /path/to/file3

这使用数组a来跟踪我们到目前为止看到的md5总和。对于每一行,如果md5之前没有出现!($1 in a),我们将md5标记为已经看到并打印该行。

替代

较短版本的代码是:

$ awk '!a[$1]++' file
266ab54fd8a6dbc7ba61a0ee526763e5 /path/to/file1a
88761da2c2a0e57d8aab5327a1bb82a9 /path/to/file2a
cc640e50f69020dd5d2d4600e20524ac /path/to/file3

这使用数组a来计算md5sum $1出现的次数。如果计数最初为零,则打印该行。