Поиск каталогов, файлы которых явно содержат escape-знаки, такие как], - Пробел все вместе

211
Linuxwhisperer

У меня есть несколько видеофайлов, которые содержат 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-знаки? Есть ли какой-либо способ или необходимо заменить escape-знаки в именах файлов? Я хочу предотвратить это. Заранее спасибо.

0
Вы пытались сбежать от этих спасательных персонажей? По крайней мере, это помечено как решение для [Как найти файлы по именам, которые содержат скобки?] (Https://stackoverflow.com/questions/15928827/how-to-find-files-by-names-which-contains-brackets ). Поскольку вы используете шаблон для соответствия, вам, вероятно, придется избегать этих символов. Seth 6 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

-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) 

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

Сперва спасибо Дело в том, что имена (кино) являются фиксированными, предустановленными. Я не могу добавить \, чтобы передать escape специальные символы. Я просто хочу передать содержимое переменной (здесь $ video) независимо от того, что она содержит. И да, $ dname должно содержать имя каталога, в котором находится видео. Linuxwhisperer 6 лет назад 0
@Linuxwhisperer Я приспособил свой ответ к вашим потребностям. Kamil Maciorowski 6 лет назад 0
Я пытался - безрезультатно ... Linuxwhisperer 6 лет назад 0
@Linuxwhisperer Это работает в моем Kubuntu. Просто чтобы убедиться: вы не ожидали, что `dname =…` вернет что-то, вы проверили `echo $ dname` после, верно? Можете ли вы дать мне какой-либо отзыв? (например, «оно работает с таким-то именем файла, но не с…» или «` video1` кажется неправильным, потому что… »). Kamil Maciorowski 6 лет назад 0
Извините за поздний ответ. Мне пришлось попробовать еще раз, скопировать и вставить и принять ... Теперь вы, кажется, работает. Сейчас я сделаю больше тестов в моих скриптах. Еще раз спасибо! Linuxwhisperer 6 лет назад 0
@Linuxwhisperer Честно говоря, в строке `video1 =…` была ошибка, я исправил ее сразу после публикации. Вы должны были быть достаточно быстры, чтобы скопировать ошибочную версию. Простите за это. Kamil Maciorowski 6 лет назад 0

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