Найдите файлы с тем же именем, но различные расширения и удаляют самое старое

У меня есть папка с файлами как это:

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)

Сохраните новейшие файлы, неважно, расширением.

0
задан 18 July 2018 в 18:12

1 ответ

Я записал короткий сценарий удара.

Требуются все файлы непапки в папке (от которого это выполняется), и перемещает более старые файлы с тем же именем к папке.

Я назвал папку "remove_##", где ## является числом.
Названия файлов взяты в качестве того же, если они - то же перед последней точкой! например, 123.png взят в качестве того же как 123.jpg, но не в качестве 123.tar.gz.
Если два (или больше) файлы имеют то же время изменения, чем сценарий сохраняет первый, он встретился и пишет сообщение для вывода.

Это ничего не должно делать плохо при использовании его в правильной папке!

remove_older.sh:

#!/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
0
ответ дан 28 October 2019 в 07:53

Другие вопросы по тегам:

Похожие вопросы: