Поиск самых больших файлов, которые не содержат строку - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь перекодировать мои большие файлы AVI / MKV в X264 или более раннем формате на моем медиа-сервере. Моя идея состоит в том, чтобы найти самые большие файлы, которые еще не закодированы в формате HVE C (он же x265), и конвертировать их. Для этого я использовал следующую команду в домашней папке моего сервера (Ubuntu 14.04.6):

find . -printf '%s %p\n'|sort -nr|head -n 10

Это работает, и добавление 5 или 10 к последнему числу покажет мне следующие 15 до 20 самых больших файлов, но я хотел бы удалить из списка уже закодированные в HVE C медиа-файлы из списка, чтобы сэкономить время.

Я смог использовать GREP для поиска 'HVE C 'с командой, подобной этой:

grep -Ril 'HEVC' .

А также файлы, которые не кодируются HEV C с этой командой

grep -vRil x265 .

Но я не смог найдите комбинацию двух команд, чтобы показать 10 самых больших файлов, которые еще не были закодированы. Я в основном пытаюсь перечислить 10 самых больших файлов, которые еще не кодируются в HVE C.

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 31 января 2020

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

./**/*(.NOL)

. в квалификатор globbing (.NOL) заставляет шаблон соответствовать только обычным файлам, в то время как N расширяет шаблон до нуля, если здесь нет соответствия (как если бы bash использовалось в *1009*), а OL упорядочивает совпадает по длине / размеру в порядке убывания.

Проходя по ним, пока файл не содержит строку x265:

for pathname in ./**/*(.NOL); do
    if ! grep -qF 'x265' $pathname; then
        break
    fi
done

Значение $pathname будет наибольшим файл, не содержащий строку x265.

Чтобы получить массив этих файлов, вы можете сделать

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY']) )

, чтобы получить массив только первых 10 таких файлов (то есть 10 самые большие файлы, не содержащие строку x265):

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10]) )

Чтобы напечатать значения массива в одном столбце:

print -rC1 -- $files

To l oop по 10 файлам , используйте

for pathname in ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10])
do
    # process $pathname here
done

или

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10]) )
for pathname in $files; do
    # process $pathname here
done

Обратите внимание, что t grep -q -v expression очень отличается от ! grep -q expression. Первое вернет true , если есть строки, которые не соответствуют expression, а второе вернет true , если нет строк, соответствующих expression.

...