Проблема с использованием «цикла while» и последующей обработкой данных в сценарии bash

Я понял, что проблема связана с gcc при компиляции ядра. Я применил патч ниже, и он исправлен.

https://lkml.org/lkml/2015/4/23/605

1
25.11.2021, 11:00
1 ответ

Предполагая, что ваши имена файлов не содержат символов новой строки, вам не нужно их каким-либо образом изменять. Вывод из fileимеет одну строку для каждого имени файла, поэтому просто сохраните его и переберите полученный файл в цикле:

> non-hevc.txt        # clear the output list
find "$vpath" -type f \( -iname "*.mkv" -o -iname "*.mp4" -o -iname "*.avi" \) \
 > full_list.txt
while IFS= read -r file; do 
    result=$(ffprobe -v error -select_streams v:0 -show_entries \
             stream=codec_name -of default=noprint_wrappers=1:nokey=1 -i "$file")
    if [ "$result" != hevc ]; then
        echo "$file" >> non-hevc.txt
    fi
done < full_list.txt
rm -f full_list.txt

Здесь вывод ffprobeфиксируется с помощью подстановки команд $(...)и сохраняется в result, который мы затем просматриваем.

Не вижу смысла танцевать с sed -n "$nrl"pвнутри цикла чтения списка имен файлов, так как readуже читает ту же строку. Однако нам нужны IFS=и -r, чтобы не искажать ввод.

Также нет причин экранировать любые пробелы с помощью обратной косой черты, расширение в кавычках для "$file"передает содержимое переменной как -в команду. Отмена экранирования также будет затруднена, когда вы используете eval, он также обрабатывает много других вещей и будет блевать, например. скобка.

Не уверен, хотите ли вы добавить вывод findк тому, что уже содержится в full_list.txt, или воссоздать список. Поскольку мы обрабатываем список немедленно, мне кажется, имеет больше смысла игнорировать любое старое содержимое.

Обратите внимание, что, как и в случае с комментариями terdon, промежуточный файл не обязательно нужен для хранения списка имен файлов. Вы можете сделать просто find... | while IFS= read file, do...или с заменой процесса в Bash/ksh/zsh while IFS= read file, do... done < <(find...). Разница между ними имеет значение, если вы хотите установить переменные внутри цикла while, см. :. Почему моя переменная локальна в одном цикле while read, но не в другом, казалось бы, похожем цикле?

1
25.11.2021, 11:44

Теги

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