查找具有相同名称但扩展名不同的文件并删除最旧的文件

查找具有相同名称但扩展名不同的文件并删除最旧的文件

我有一个文件夹,里面有如下文件:

1.jpg (Modified 2018-07-18 12:00:00)
1.png (Modified 2018-07-17 12:00:00)
2.jpg (Modified 2018-07-18 14:00:00)
3.jpg (Modified 2018-07-17 20:00:00)
4.jpeg (Modified 2018-07-17 12:00:00)
4.gif (Modified 2018-07-18 11:00:00)
4.png (Modified 2018-07-18 13:00:00)

我需要这样:

1.jpg (Modified 2018-07-18 12:00:00)
2.jpg (Modified 2018-07-18 14:00:00)
3.jpg (Modified 2018-07-17 20:00:00)
4.png (Modified 2018-07-18 13:00:00)

保留最新的文件,无论扩展名是什么。

答案1

我写了一个简短的 bash 脚本。

它将一个文件夹中的所有非文件夹文件(从中执行)移出,并将同名的旧文件移动到文件夹中。

我将文件夹命名为“remove_##”,其中 ## 是一个数字。
如果文件名在最后一个点之前相同,则认为文件名相同!例如123.png视为与123.jpg但不是123.tar.gz
如果两个(或更多)文件的修改时间相同,则脚本会保留它遇到的第一个文件并将消息写入输出。

如果您在正确的文件夹中使用它,它不会做任何坏事!

删除旧文件

#!/bin/bash

REMOVE_FOLDER="remove_"$$
mkdir $REMOVE_FOLDER

ls --color=never -p | grep -v / | sed "s;\..*;;g" | sort -n | uniq  | \
while read -r line || [[ -n "$line" ]]; do 
    time=0   # currently a youngest mtime of files with $line name
    newest=0 # currently a youngest file with $line name

    for file in $line.* ; do
        mtime=`stat -c %Y $file` # reads mtime of $file
        if [[ "$mtime" -gt "$time" ]]; then # we found younger file
            time=$mtime
            newest=$file
        elif [[ "$mtime" -lt "$time" ]]; then # we found older file
            mv $file $REMOVE_FOLDER
        else  # files have same modification time -> does nothing
            echo "File $file has same modification time as $newest!"
        fi
    done

    if [[ "$newest" != 0 ]]; then # we found some files!
        for file in $line.* ; do
            if [[ $file != $newest ]]; then
                mv $file $REMOVE_FOLDER # remove older file 
            fi
        done
    fi
done

相关内容