让一个文件夹包含具有相同名称但文件不同的文件

时间:2013-11-13 18:14:45

标签: linux bash

我正在尝试将原始文件从一个目录复制到另一个目录,但是一些文件具有相同的名称...我正在尝试使用哈希来比较文件,如果它不在目录中发送它并且如果名称是同样将其更改为file_name.something。此时我正在获取一些文件,并且正在覆盖具有相同名称的文件......任何人都可以提出建议吗?

#!/bin/bash -xv

source_folder=$1
destination_folder=$2

if [ $# -eq 0 ] 
then 
    echo "usage:$0 directory_name";exit 999; 
fi

if [ -d $source_folder ]
then
     echo "source source_folder exists."
else
     echo "Source folder doesn't exist"
     exit 1;
fi

if [ -d $destination_folder ]
then
    echo "Destination folder exists"
else
    mkdir $destination_folder
fi



find "$source_folder" -name "IMG_[0-9][0-9][0-9][0-9].JPG" -exec ./check {} $destination_folder/ \;





 #!/bin/bash -xv

file=$1
destination_folder=$2
file_hash=`md5sum "$file" | cut -d ' ' -f 1`

for a in $destination_folder/*
do
   curr_hash=$(md5sum "$a" | cut -d ' ' -f 1)
   curr_file=$a

   if [ ! "$file_hash" == "$curr_hash" ]; 
   then
   if [[ -f $destination_folder/$file ]] ;
   then # CAN ANYBODY TELL ME WHY IT IGNORES THIS LINE
      cp "$file" "$file.JPG"
      mv "$file.JPG" "$destintion_folder" 
     else # IT GOES STRAIGHT FOR THIS ONE
       cp "$file" "$destination_folder"
   fi
   fi

done

1 个答案:

答案 0 :(得分:2)

您的if [ "$file_hash" == "$a" ];将哈希值与文件名进行比较。你需要像

这样的东西
if [ "$file_hash" == $(md5sum "$a" | cut -d ' ' -f 1) ];

计算目标文件夹中每个文件的哈希值。

此外,您的for循环在其当前版本中仅运行一次;你需要像

这样的东西
for a in $destination_folder/*

获取该文件夹中的所有文件,而不仅仅是文件夹名称。

根据您的修改,解决方案看起来像

#!/bin/bash -xv

file=$1
destination_folder=$2
file_hash=`md5sum "$file" | cut -d ' ' -f 1`

# test that the filename exists in the destination dir
if [[ -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
    fi
else
    # destination does not exit, copy file
    cp "$file.JPG" "$destination_folder/$file"
fi

这不能确保没有重复项。它只是确保具有相同名称的不同文件不会相互覆盖。

#!/bin/bash -xv

file=$1
destination_folder=$2
file_hash=`md5sum "$file" | cut -d ' ' -f 1`

# test each file in destination
for 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
   fi
done

if [[ $exists != 1 ]] ; then
   if [[ -f $destination_folder/$file ]] ; then
       cp "$file.JPG" "$destination_folder/$file.JPG"
   else 
       cp "$file.JPG" "$destination_folder"
   fi
fi

未经测试。