2015-11-19 55 views
0

我在寫一個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'告訴你文件是否相同,它逐字節地進行比較。 –

回答

1

這並沒有完全測試,但這是否對你有用?基本上只是圍繞從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