У меня есть несколько видеофайлов, которые содержат escape-символы, такие как [в сочетании с [1920x1080]. Когда я выполню:

find /run/media/user/usbdisk -type f -iname [HD, 1920x1080] - Wild Wild West.mp4 -ls

тогда я получаю сообщение об ошибке:

find:paths must precede expression

Когда я выполню

find /run/media/user/usbdisk -type f -iname "[HD, 1920x1080] - Wild Wild West.mp4" -ls

Я не получаю результат, хотя я уверен, что файл существует.

Тот же результат (ничего не найдено) при выполнении:

find /run/media/user/usbdisk -type f -iname '[HD, 1920x1080] - Wild Wild West.mp4' -ls

Чтобы получить имя каталога (базовое имя) моего фильма, я сохранил имя в переменной с именем video, так что моя команда наконец-то выглядит так:

dname=$(find /run/media/user/usbdisk -type f -iname "$video" -exec dirname {} \;)

но это приводит к ошибке (см. выше).

Как я могу заставить команду find (или любую другую) точно найти мой точно названный файл, включая управляющие знаки? Есть ли какой-либо способ или необходимо заменить escape-знаки в именах файлов? Я хочу предотвратить это. Заранее спасибо.

1 ответ1

1

-iname оценивает свой аргумент, * и [] имеют особое значение для этого, поэтому вы должны избегать их, если вы хотите передать их буквально.

Также рассмотрите возможность использования -quit на тот случай, если вы обнаружите два или более файлов в разных папках (дубликаты?). Я полагаю, вы ожидаете, что dname будет одним именем каталога.

Я понимаю, что $video уже дано:

video="[HD, 1920x1080] - Wild Wild West.mp4"

В этом случае попробуйте:

video1=$(echo $video | sed 's|\[|\\[|g; s|\]|\\]|g')
dname=$(find /run/media/user/usbdisk -type f -iname "$video1" -exec dirname {} \; -quit)

Это можно сделать в одну строку. Я решил ввести дополнительную переменную для ясности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .