在文件名中查找命令



我有一个带有图像的文件夹喜欢以下:

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)

相关内容

  • 没有找到相关文章