2014-01-21 3 views
0

У меня есть папка с изображениями любит это:найти команду на имя файла

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 не подходит для размещения такого спроса. В этом случае, пожалуйста, извините меня.

ответ

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 

Если вы хотите, чтобы быть рекурсивным в Баш 4+ вы можете просто изменить его на

... 
shopt -s globstar 
for i in $(echo **/*_*.png | sort) 
... 

Хотя в данном случае я бы определенно не забудьте проверить, что мы имеем дело с number_number. png перед удалением чего-либо.

+1

Цитата из OP: »... для _each_ userid ...« – Alfe

+0

@Alfe Yea, misread OP. Все еще не уверен, что я точно понимаю, чего он хочет, но отредактировал – BroSlow

+0

Это довольно просто. Он хочет сохранить только новейший образ каждого пользователя. Все остальные файлы должны быть удалены. – Alfe

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 

чтобы найти все UserIds из имен файлов только вы можете использовать:

userids=$(find /path/to/my/images -name "*_*.png" -print | sed 's/_.*//' | sort -u) 
1

Я считаю, что изображения находятся в том порядке, в котором вы хотите, потому что дата все возрастает (тикает с 1970 года).

, попробуйте это, и замените эхо для фактической команды.

ПРИМЕЧАНИЕ. Я тестировал это на OS X, поэтому вам может не понравиться опция -E nvm, опция -E в linux тоже ок.Извините за сумбур

Отметим также, что последний файл всегда хранится, потому что он всегда будет новейший файл последнего пользователя, так что даже не строка вывода для него

#!/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 
+0

В Linux, опция sed E будет работать? –

Смежные вопросы