2016-10-10 83 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