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



我想创建一个bash脚本,在给定的目录中搜索要复制的图片。图片的名称格式必须为IMG_\d\d\d.JPG。如果图片有重复的文件名,请将其复制到/images/archive并在其名称末尾附加.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

提前谢谢。

让我们假设您有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出现的次数。如果计数最初为零,则打印该行。

最新更新