比较Linux中多个文件的文件名和md5sums

问题描述:

我在写一个bash脚本,它将图像从一个目录(及其所有子目录)复制到另一个目录。比较Linux中多个文件的文件名和md5sums

到目前为止,我有这样的:

find . -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -exec cp {} ~/$output \; 

这工作,但问题是比这更复杂。有两种情况:

  • 一些图像具有相同的名称,但是是不同的。在这个 的情况下,他们将被重新命名,只需在名称的末尾添加第二个“.JPG”即可。
  • 但是,如果两个文件具有相同的名称并且是相同的文件,则只应将一个文件复制到输出目录,并将另一个文件的绝对路径写入文本文件 - duplicates.txt。

我在想我需要在文件名上使用cmp,然后使用md5sum来检查相同的文件,但是我不确定如何在文件名上使用cmp,或者甚至可能。

在此先感谢您的帮助!

+1

'fdupes'命令可能会做你想做的。 –

+0

'cmp'告诉你文件是否相同,它逐字节地进行比较。 –

这并没有完全测试,但这是否对你有用?基本上只是围绕从find输出循环,检查您指定的条件,并执行适当的操作。输入目录作为第一个参数传递,作为第二个参数输出。

#!/bin/bash 

input=$1 
output=$2 
logfile=~/duplicates.txt 

while IFS= read -r -d '' f 
do 
    #strip the input directory name from the file 
    f=${f/$input\//} 
    echo Working with $f 
    #check if the file exists 
    if [ -f "$output/$f" ]; then 
     if cmp -s "$input/$f" "$output/$f"; then 
      #file is identical 
      echo "$f" >> "$logfile" 
     else 
      #same filename, but different file 
      cp --parents -p "$input/$f" "$output/$f.JPG" 
     fi 
    else 
     cp --parents -p "$input/$f" "$output/$f" 
    fi 
done< <(find "$input" -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -print0) 
+0

嘿,对不起,它花了一段时间回到你身边... 我试着运行你的代码,它给了我3个错误。显然是“:第4行找不到命令”(可能是因为没有第4行) 和第22行的2个错误,有关语法 – x4iiiis