Может кто-нибудь помочь мне с относительно сложным шаблоном сопоставления файлов в командной строке?

У меня есть файлы в каталоге следующим образом:

1.png
1_thumb.png
1-1.png
1-1_thumb.png
1-2.png
1-2_thumb.png
2.png 
2_thumb.png
2-1.png
2-1_thumb.png
3.png
3_thumb.png
3-1_thumb.png

Я хочу перечислить все файлы, которые не имеют копии с тем же именем файла с -1 где-то в нем. Таким образом, в приведенном выше примере результаты будут 3.png .

NB: файл и его копия с «-1» будут иметь одинаковый размер файла, если это поможет.

Кто-нибудь может подсказать, как это сделать?

2 ответа2

2

Предполагая, что все файлы с -n являются копиями и что вам не нужны большие пальцы, это работает в KornShell (ksh), а также в Bash с extglob параметром extglob (shopt -s extglob):

for f in !(*_thumb.png|*-[1-9].png); do
  g=${f%.png}-1.png
  test -f $g || echo $f
done
0

Если только «-1» определяет, что это копия, то у вас также нет копии ваших файлов 2-1.png или 2-1_thumb.png. Если это ваш критерий соответствия, и вы хотите проверить большие пальцы, вы можете сделать

for i in `ls |grep -v "\-1"  | cut -f1 -d.`; do 
    if `echo $i | grep thumb > /dev/null`; then 
        test -f `echo $i.png | sed 's/_/-1_/g'` || echo $i.png; 
    else 
        test -f $i-1.png || echo $i.png; 
    fi; 
done

В противном случае, если большие пальцы не в счет, ответ КАК должен подойти

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .