在文件名上查找命令

时间:2014-01-21 11:32:46

标签: bash command find

我有一个图像文件夹,如下所示:

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。

我的目标是删除每个USERID的所有旧图像,并仅保留最后一个。

例如,我需要删除这些:

395629_1365148250.png
395629_1365148251.png
395629_1365148252.png
395629_1365148253.png

并保留这一个。

395629_1365148254.png

如果每个用户只有一个图像,我必须保留图像。

我在这方面工作了很长时间,但我能够做到这一点。我使用了“find”命令,但是我在bash linux命令中不是很好,不管怎么说都不行。

可能是stackoverflow不是发布此类需求的正确位置。在这种情况下,请原谅。

3 个答案:

答案 0 :(得分:2)

似乎基本的排序应该没问题。所以只需做一些像

这样的事情
#!/bin/bash
for i in $(echo *_*.png | sort); do
  current="$i"
  [[ $current != "" ]] && [[ $last != "" ]] && [[ ${current%%_*} == ${last%%_*} ]] && rm "$last"
  last="$current"
done          

e.g。

$ 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。

答案 1 :(得分:1)

我相信这些图片按你想要的顺序排列,因为日期一直在增加(自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

答案 2 :(得分:0)

循环遍历每个用户标识(您可能有一个列表,所以我不会通过从文件名中取出它来解决该问题),然后按降序列出该用户标识的所有文件(最新的第一个) ,然后使用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)
相关问题