我有一个文件夹,里面有如下文件:
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