LINUX.ORG.RU

Как правильно заэкранировать параметры?

 ,


0

1

Если взять к примеру

find  \( -iname "*.webm" -o  -iname "*.rv" -o -iname "*.qt" \)
то это прекрасно работает. А вот когда расширений много и они генерируются для подстановки, уже ничего не получается
set -x 
subst='-iname "*.webm" -o  -iname "*.rv" '
find  \( $subst -o -iname "*.qt" \)
set +x
+ find '(' -iname '"*.webm"' -o -iname '"*.rv"' -o -iname '"*.qt"' -o -iname '*.qt' ')'
Обратные слеши не помогают.

Deleted

в лучших традициях лора описывается велосипед, которые ТС придумал для решения своей задачи, при этом ни слова о самой задаче. Вот тебе более мой велосипед

ls **/(#i)*.{qt,rv,webm}

zolden ★★★★★ ()

subst='-iname «*.webm» -o -iname «*.rv» '

а без двойных кавычек?

anonymous ()
Ответ на: комментарий от zolden

в лучших традициях лора описывается велосипед, которые ТС придумал для решения своей задачи, при этом ни слова о самой задаче.

Я пишу свой негодный скрипт с целью упростить просмотр анимы. Мой негодный скрипт содержит одну ужасную функцию, которая проверяет, является ли некий негодный файл видеофайлом, для чего парсит великолепный /usr/share/mime/globs и выдирает оттуда его прекрасные расширения. Примерно так:

is_videofile() {
vextensions="`sed -rn 's/^video[^*]+\*?\.(.*)$/-iname "*.\1" -o /p' /usr/share/mime/globs`"
find "$basepath/$chosen_one" -maxdepth 2 -type f \( $vextensions -iname "*.ogm" \) | sort
}
Загвоздка состоит в том, что в $basepath/$chosen_one может быть как путь к моим разным негодным файлам, так и какой-нибудь одиночный негодный медиафайл, и find это поймёт и сделает всё правильно, а ваш прекрасный, восхитительный велосипед, Зольден-сан, я не понимаю, как адаптировать в свои ужасные условия, сумимасен.

Deleted ()
Ответ на: комментарий от sdio

А так bash пытается выполнить eval над каждым подставленным '-iname «тра-та-та» -o'

++++ find '/home/video/anime/Azumanga Daioh' -maxdepth 2 -type f '(' -iname '*.webm' -o
find: expected an expression after '-o'
++++ -iname '*.rv' -o
-bash: -iname: command not found
++++ -iname '*.qt' -o
-bash: -iname: command not found
++++ -iname '*.3g2' -o
-bash: -iname: command not found
++++ -iname '*.fxm' -o
-bash: -iname: command not found
++++ -iname '*.ts' -o
И это я проэкранировал кавычки \" в выражении с sed, которое выше.
vextensions="`sed -rn 's/^video[^*]+\*?\.(.*)$/-iname \"*.\1\" -o /p' /usr/share/mime/globs`"
Одинарные туда не поставить, потому что тогда \1 не будет расшифровываться, а совсем без кавычек нельзя, если у меня в каталоге найдутся файлы, скажем avi во время подстановки маски *.avi, то она будет заменена на список этих найденных avi файлов. Хотя про eval я забыл, буду его пробовать дальше, спасибо за напоминние.

Deleted ()

конкретно в этом случае поможет вот это:

subst='-iname *.webm -o  -iname *.rv '
find  \( $subst -o -iname "*.qt" \)
почему ошибка происходит - потому что в find в качестве 3-его параметра передавалось «*.webm», а не как хотелось *.webm

anonymous ()
Ответ на: комментарий от Deleted

Я пишу свой негодный скрипт с целью упростить просмотр анимы. Мой негодный скрипт содержит одну ужасную функцию, которая проверяет, является ли некий негодный файл видеофайлом, для чего парсит великолепный /usr/share/mime/globs и выдирает оттуда его прекрасные расширения.

А file -i не судьба заюзать?

geekless ★★ ()
Ответ на: комментарий от geekless

А есть какая-нибудь альтернатива или можно как-то поменять то, чем пользуется file для определения mime? А то я заметил, что некоторые mkv он определяет как «application/octet-stream» вместо «video/x-matroska».

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.