2016-10-10 85 views
0

我有一個文件結構,看起來大致如下:如何查找並刪除重複項並保持最新?

dir1 
|--subdir1 
    |--file1 (modified date1) 
    |--file2 (modified date2) 
    |--file3 (modified date1) 
|--subdir2 
    |--file4 (modified date3) 
    |--file5 (modified date4) 
    |--file6 (modified date3) 

的文件是略有不同的ID3的音樂文件的,所以fdupes不抓住他們爲重複雖然他們。我想從dir1運行一個命令,它將遞歸到每個子目錄中,找到所有文件的最大修改日期,然後提示刪除修改日期早於最大日期的任何文件。

有沒有辦法在linux做到這一點?預期結果將是:

dir1 
|--subdir1 
    |--file1 (modified date1) 
    |--file3 (modified date1) 
|--subdir2 
    |--file4 (modified date3) 
    |--file6 (modified date3) 
+0

如果文件不完全相同,我們怎麼知道一個是另一個重複?如果沒有這些信息,您的「預期」結果就會出乎意料。 – tripleee

+0

我知道它們是重複的,因爲這些文件最初是由ID3 Artist和Album組織的。有重複的原因是我重新使用略有不同的ID3曲目信息翻錄專輯。我沒有辦法編程檢查實際的重複,但我知道他們在那裏。 – wesanyer

回答

0

stat -c %Y <file>會給你文件的最後修改的時間,因爲Epoch傳遞秒。爲了找到「最大的修改日期」(我以爲是最新修改):

for i in `ls -1 subdir1/`; do stat -c %Y subdir1/${i} >> mod_dates.txt;done 
latest_mod=`cat mod_dates.txt | sort -nr | head -n 1` 

要刪除舊文件:

for i in `ls -1 subdir1/`; do if [[ `stat -c %Y $i` -lt $latest_mod ]]; then rm subdir1/${i};fi;done 
+0

首先檢查'sort -n'是否給你一個最早到最新的訂單,或者從最新到最舊的訂單。無論如何,你可以用'-r'選項來反轉它。 – deefff

+0

事實上,你需要反轉'sort'的結果。我檢查並更新了我的答案。另外,如果你需要在更多的subdirs上做這件事,你可以把整個東西放在另一個for循環中,如下所示:'for''ls -d */\';在這裏插入其餘的代碼。 done'當然,你將不得不將'subdir1'的引用替換爲'$ j'。 – deefff