我有一个带有图像的文件夹喜欢以下:
395629_1365148250.png
395629_1365148251.png
395629_1365148252.png
395629_1365148253.png
395629_1365148254.png
415678_1387545677.png
429651_1390056123.png
429651_1390056124.png
429651_1390056125.png
522600_1389607024.png
529485_1389879560.png
名称就是这样:userid_date.png。
我的目标是为每个用户ID删除所有旧图像,并仅保留最后一个图像。
例如,我需要删除这些:
395629_1365148250.png
395629_1365148251.png
395629_1365148252.png
395629_1365148253.png
并保留这个。
395629_1365148254.png
如果每个用户只有一个图像,我必须保留图像。
我很长一段时间来处理这个问题,但我能够做到这一点。我使用了" find"命令,但是我在bash linux命令中不是很好,无论如何都不那么好。
可能是stackoverflow并不是发布这种需求的正确位置。在这种情况下,请原谅我。
似乎基本排序应该很好。所以只做
之类的事情#!/bin/bash
for i in $(echo *_*.png | sort); do
current="$i"
[[ $current != "" ]] && [[ $last != "" ]] && [[ ${current%%_*} == ${last%%_*} ]] && rm "$last"
last="$current"
done
,例如
$ ls -1
395629_1365148250.png
395629_1365148251.png
395629_1365148252.png
395629_1365148253.png
395629_1365148254.png
415678_1387545677.png
429651_1390056123.png
429651_1390056124.png
429651_1390056125.png
522600_1389607024.png
529485_1389879560.png
$ ./script
$ ls -1
395629_1365148254.png
415678_1387545677.png
429651_1390056125.png
522600_1389607024.png
529485_1389879560.png
如果您希望它在Bash 4 中具有递归,则可以将其更改为
...
shopt -s globstar
for i in $(echo **/*_*.png | sort)
...
尽管在这种情况下,我肯定会确保在删除任何内容之前先检查我们正在处理number_number.png。
我相信这些图像是您想要的顺序,因为日期一直在增加(自1970年以来的刻度)。
所以尝试一下,然后将回声交换为实际命令。
注意我在OS X上测试了此问题,因此您可能不喜欢-e选项NVM,Linux上的-e选项也可以。对不起,混乱
还请注意,最后一个文件始终保留,因为它始终是最后一个用户的最新文件,因此它甚至没有输出线
#!/bin/bash
OLDU="X"
for file in *.png; do
NEWU=`echo $file|sed -E 's/(......)_.*/1/g'`
if [ $NEWU != $OLDU -a $OLDU != X ]; then
echo keeping $OLDF
else
if [ $OLDU != X ]; then
echo rm $OLDF
fi
fi
OLDF=$file
OLDU=$NEWU
done
产生
rm 395629_1365148250.png
rm 395629_1365148251.png
rm 395629_1365148252.png
rm 395629_1365148253.png
keeping 395629_1365148254.png
keeping 415678_1387545677.png
rm 429651_1390056123.png
rm 429651_1390056124.png
keeping 429651_1390056125.png
keeping 522600_1389607024.png
在每个用户ID上循环(您可能有一个列表,因此我不会通过将它们从文件名中获取来解决该问题),然后列出该userId的所有文件预期订单(最新的第一),然后使用tail
获取除最高的所有内容,并且rm
所有这些:
for userid in $userids
do
rm $(find /path/to/my/images -name "$userid_*.png" -print | sort -r | tail -n +2)
done
如果这些内部列表非常大:
for userid in $userids
do
find /path/to/my/images -name "$userid_*.png" -print | sort -r | tail -n +2 |
while read oldFile
do
rm "$olfFile"
done
done
要从文件名中查找所有用户ID,您只能使用:
userids=$(find /path/to/my/images -name "*_*.png" -print | sed 's/_.*//' | sort -u)