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
, вы можете остерегаться такого рода несоответствия ).
С GNU grep, с использованием режима PCRE(-P
):
$ grep -Po '(?<=E=)\d+' file
10
50
или
$ grep -Po '(?<=F=)\d+' file
20
40
$ 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
Используйте cut
для получения четвертого поля, затем sed
для удаления всего до знака равенства:
cut -f 4 -d\; | sed 's/.*=//'
Тем не менее, вы упоминаете поля, разделенные табуляцией -, хотя строки вашего образца разделяют поля точкой с запятой.
Также с 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
Если вас не волнует остальная часть строки, если вы просто хотите найти E=
или F=
везде, где они появляются, вы можете использоватьsed
:
sed -e 's/.*E=//' -e 's/;.*//'
При этом удаляется все до "E=
" включительно, а затем удаляется ;
и все, что следует за ним. Предполагается, что каждая строка содержит "E=
".
Если вы знаете, что поле E=
всегда появляется в определенном столбце (со столбцами, разделенными табуляцией, точкой с запятой или чем-то еще ),может быть предпочтительнее сначала извлечь этот столбец с помощью cut
или его эквивалента, а затем отделить часть E=
от значения. Вы можете сделать это, используя sed
, как в ответе @berndbausch, или использовать второй вызов cut
, предполагая=
-разделенных столбцов.