Я понял, что проблема связана с gcc при компиляции ядра. Я применил патч ниже, и он исправлен.
Предполагая, что ваши имена файлов не содержат символов новой строки, вам не нужно их каким-либо образом изменять. Вывод из 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, но не в другом, казалось бы, похожем цикле?