команда unix для печати чисел после "="

exiftool -q -r -if '$MIMEType =~ m{^video/} and
                    $ImageHeight < 1080 and
                    print "$Directory/$FileName\0" and 0'. |
  xargs -r0 echo rm -f

(при условии GNU xargsили совместимости ).

Будут удалены все видео, высота изображения которых меньше 1080 пикселей (, если вы рекурсивно удалитеecho)в текущем каталоге. Это предполагает, что имена файлов (должным образом )закодированы в UTF -8 (, хотя см. параметр -charsetдля других кодировок ).

Вместо передачи в xargs rmвы также можете сохранить в файле (> list), чтобы сначала проверить этот список:

xargs -r0a list ls -ldrS

Если всё в порядке:

xargs -r0a list rm

Или сохраните информацию в формате JSON, чтобы у вас была вся необходимая информация в легко читаемом и разборчивом формате:

exiftool -q -r -j -if '$MIMEType =~ m{^video/}' \
  -ImageWidth -ImageHeight -VideoFrameRate -MIMEType. > list.json

Затем просмотрите этот список и удалите его по некоторым критериям:

PERL_UNICODE= json_xs < list.json -t none -e '
  for (@{$_}) {
    unlink $_->{SourceFile} if
      $_->{ImageHeight} < 1080 || $_->{VideoFrameRate} < 60
  }'

(обратите внимание, что я обнаружил, что для файлов FLV это было Videoframerateвместо VideoFrameRate, вы можете остерегаться такого рода несоответствия ).

1
23.01.2021, 01:31
5 ответов

С GNU grep, с использованием режима PCRE(-P):

$ grep -Po '(?<=E=)\d+' file
10
50

или

$ grep -Po '(?<=F=)\d+' file
20
40
9
18.03.2021, 22:35
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
10
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
50

Или еще проще:

$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
50
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
10
2
18.03.2021, 22:35

Используйте cutдля получения четвертого поля, затем sedдля удаления всего до знака равенства:

cut -f 4 -d\; | sed 's/.*=//'

Тем не менее, вы упоминаете поля, разделенные табуляцией -, хотя строки вашего образца разделяют поля точкой с запятой.

9
18.03.2021, 22:35

Также с awkвы можете попробовать это"

cat file
AAA BBB;CCC;DDD;E=10;F=20 GGG
XXX YYY;ZZZ;DDD;E=50;F=40 PPP
  • печатьE
awk -F'[=; ]' '{ print $6}' file
10
50
  • илиF
awk -F'[=; ]' '{ print $8}' file
20
40
3
18.03.2021, 22:35

Если вас не волнует остальная часть строки, если вы просто хотите найти E=или F=везде, где они появляются, вы можете использоватьsed:

sed -e 's/.*E=//' -e 's/;.*//'

При этом удаляется все до "E=" включительно, а затем удаляется ;и все, что следует за ним. Предполагается, что каждая строка содержит "E=".

Если вы знаете, что поле E=всегда появляется в определенном столбце (со столбцами, разделенными табуляцией, точкой с запятой или чем-то еще ),может быть предпочтительнее сначала извлечь этот столбец с помощью cutили его эквивалента, а затем отделить часть E=от значения. Вы можете сделать это, используя sed, как в ответе @berndbausch, или использовать второй вызов cut, предполагая=-разделенных столбцов.

0
18.03.2021, 22:35

Теги

Похожие вопросы