2011-08-16 110 views
0

我有兩個名稱不匹配的圖像目錄,但主要是匹配的圖像。如何按文件大小匹配文件並進行相應的重命名?

Dir 1  Size | Dir 2     Size 
--------------------------------------------------- 
img1.jpg 508960 | a_image_name.jpg  1038644 
img2.jpg 811430 | another_image_name.jpg 396240 
...   ... | ...     ... 
img1000.jpg 602583 | image_name.jpg   811430 
...   ... | 
img2000.jpg 396240 | 

第一個目錄有更多的圖像,但名稱有誤。第二個目錄具有正確的名稱,但不對應於第一個目錄。

我想通過比較文件大小(或其他方式)與Dir 2來重命名Dir 1中的文件。在上面的示例中,img2.jpg將被重命名爲image_name.jpg,因爲它們都具有相同的文件大小。

您能否指點我正確的方向?

最好通過應用程序(Mac),shell或php的方式。

回答

3

也許這會更明智地使用文件的散列,而不是使用文件大小?

簡而言之:使用glob(),獲取dir1中的文件列表,迭代,創建md5-hash(md5()+ file_get_contents()),將數組存儲在數組中,並使用散列作爲鍵和文件名作爲值。 爲dir2做同樣的事情。

迭代陣列1,如果在數組2重命名文件中存在具有相同散列的條目

代碼將是這樣的:(未經檢驗,未優化)

$dir1 = array(); 
$dir2 = array(); 

// get hashes for dir1 
foreach(glob('/path/to/dir1/*.jpg') as $file) { 
$hash = md5(file_get_contents($file)); 
$dir1[ $hash ] = $file; 
} 

// repeat for dir2 ... 

foreach($dir1 as $hash => $file1) { 
if(array_key_exists($hash, $dir2)) { 
    rename($file1, $dir2[ $hash ]); 
} 
} 
+1

這是一個很好的答案,但是,你可以使用md5_file($文件),而不是MD5(的file_get_contents($文件)) – Landon

+0

我以爲這存在,但說實話,我是懶得尋找到手動;)順便說一句,當然沒有必要建立2個數組 – wonk0

2

這裏是我的解決方案,它重命名文件在dir1中根據文件大小。

DIR1的內容:

-rw-r--r-- 1 haiv staff 10 Aug 16 13:18 file1.txt 
-rw-r--r-- 1 haiv staff 20 Aug 16 13:18 file2.txt 
-rw-r--r-- 1 haiv staff 30 Aug 16 13:18 file3.txt 
-rw-r--r-- 1 haiv staff 205 Aug 16 13:18 file4.txt 

(注:第五列存儲的文件大小。)和DIR2的內容:

-rw-r--r-- 1 haiv staff 30 Aug 16 13:18 doc.txt 
-rw-r--r-- 1 haiv staff 205 Aug 16 13:18 dopey.txt 
-rw-r--r-- 1 haiv staff 20 Aug 16 13:18 grumpy.txt 
-rw-r--r-- 1 haiv staff 10 Aug 16 13:18 happy.txt 

創建一個文件調用〜/ rename.awk(是的從主目錄,以避免污染要麼DIR1或DIR2):

/^total/ {next} # Skip the first line (which contains the total, of ls -l) 

{ 
    if (name[$5] == "") { 
     name[$5] = $NF 
     print "# File of size", $5, "should be named", $NF 
    } else { 
     printf "mv '%s' '%s'\n", $NF, name[$5] 
    } 
} 

現在,cd到DIR1(如果你想重命名Dir1中的文件),併發出以下命令:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l) 

輸出:

# File of size 30 should be named doc.txt 
# File of size 205 should be named dopey.txt 
# File of size 20 should be named grumpy.txt 
# File of size 10 should be named happy.txt 
mv 'file1.txt' 'happy.txt' 
mv 'file2.txt' 'grumpy.txt' 
mv 'file3.txt' 'doc.txt' 
mv 'file4.txt' 'dopey.txt' 

一旦你對結果滿意,管上面的命令SH執行的更改:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l) | sh 

注:

  1. 沒有保障針對相同大小的文件。爲此,wonk0提供的MD5解決方案效果更好。
  2. 請在提交之前檢查輸出。更改是永久性的。
相關問題