您
if [ "$file_hash" == "$a" ];将哈希与文件名进行比较。你需要类似的东西
if [ "$file_hash" == $(md5sum "$a" | cut -d ' ' -f 1) ];
计算目标文件夹中每个文件的哈希值。
此外,在当前版本中,您的for循环仅运行一次;你需要像
for a in $destination_folder/*
获取该文件夹中的所有文件,而不仅仅是文件夹名称。
根据您的修改,解决方案看起来像
#!/bin/bash -xvfile=$1destination_folder=$2file_hash=`md5sum "$file" | cut -d ' ' -f 1`# test that the filename exists in the destination dirif [[ -f $destination_folder/$file ]] ; then dest_hash=$(md5sum "$destination_folder/$file" | cut -d ' ' -f 1) # test that the hash is the same if [[ "$file_hash" == $curr_hash ]] ; then cp "$file.JPG" "$destination_folder/$file.JPG" else # do nothing fielse # destination does not exit, copy file cp "$file.JPG" "$destination_folder/$file"fi
这不能确保没有重复项。它只是确保具有相同名称的不同文件不会相互覆盖。
#!/bin/bash -xvfile=$1destination_folder=$2file_hash=`md5sum "$file" | cut -d ' ' -f 1`# test each file in destinationfor a in $destination_folder/*do curr_hash=$(md5sum "$a" | cut -d ' ' -f 1) if [ "$file_hash" == $curr_hash ]; then # an identical file exists. (maybe under another name) # do nothing exists=1 break fidoneif [[ $exists != 1 ]] ; then if [[ -f $destination_folder/$file ]] ; then cp "$file.JPG" "$destination_folder/$file.JPG" else cp "$file.JPG" "$destination_folder" fifi
未经测试。



