используйте find -exec с именем файла, содержащим знак доллара ($)

echo "$WINDOW"

— в одну сторону; другим может быть Ctrl-aEnter ; *указывает ваше текущее окно и номер, например 0здесь:

0*$ bash  2-$ bash

Ссылка:

0
22.02.2020, 15:21
2 ответа

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

find./ -type f  -iregex '.*\.flac'  -exec sh -c 'ffmtest=$(ffmpeg -v error -i "$1" -f null - 2>&1);if [ -n "$ffmtest" ];then echo -e "$1\n" $ffmtest;fi' -- {} \;
1
28.04.2021, 23:22
find. -type f  -iregex '.*\.flac'  -exec sh -c '
  for file do
    ffmtest=$(ffmpeg -v error -i "$file" -f null - 2>&1)
    if [ -n "$ffmtest" ]; then
      printf "%s\n" "$file" " $ffmtest"
    fi
  done' sh {} +

Несколько правил:

  • никогда не встраивайте {}— это аргумент кода, передаваемыйsh(или любому интерпретатору языка ), что может привести к уязвимости, связанной с внедрением кода (, он также не переносим ). В вашем примере все было не так уж и плохо. Но если бы файл назывался, например, $(reboot).flac, это могло бы иметь более серьезные последствия. Здесь мы передаем{}+, чтобы как можно больше было передано вsh)для findдля раскрытия в аргументе встроенного скрипта, а не в коде этого встроенного скрипта.
  • Расширения параметров всегда заключаются в кавычки в контексте списка.
  • не используйте echoдля произвольных данных.
2
28.04.2021, 23:22

Теги

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