Bash: невозможно расширить подстановочный знак в имени файла из командной переменной «read» - PullRequest
0 голосов
/ 02 апреля 2020

Я исчерпал все поиски, которые мог.

Я пытаюсь прочитать имя файла / путь из CLI, используя read, чтобы я мог связать файлы для сортировки в большом количестве. Я пробовал все виды вещей, от кавычек до ни одного, пытался использовать eval для расширения и многое другое. Ни один из них не работает.

Вот мой скрипт в его текущем состоянии:

#!/bin/bash
read -p "from? (explicit, folder/) " -e from
read -p "to? (explicit, folder/) " -e to
read -p "base filename before ep name? " -e formatOldStart
read -p "base filename after ep name? " -e formatOldEnd

...

  lnFrom=$from$formatOldStart$currentEpisodeNumber$formatOldEnd

  echo $lnFrom

  #ln "$lnFrom" "$lnTo"

Вот пример использования:

$ from? (explicit, folder/) $HOME/archive/_DATA_ARCHIVE/.data/Example\ Complete\ Series\ +\ Movies\ \[Dual\ Audio\]/Example\ \[Dual\ Audio\ DVD\ 480p\]/
$ to? (explicit, folder/) $HOME/archive/_DATA_ARCHIVE/_video_storage/Anime/Shows/Example/Season\ 1/
$ base filename before ep name? \(Hi10\)_Example_-_
$ base filename after ep name? _(DVD_480p)_(a-S)_(*).mkv

А затем вот вывод:

$HOME/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_015_(DVD_480p)_(a-S)_(*).mkv

Вот ожидаемый результат:

/home/user/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_015_(DVD_480p)_(a-S)_(6852D8ED).mkv

Мне удалось получить ожидаемый результат только после ручной вставки подстановочных знаков (не регулярное выражение) и имен файлов, предложенных в этого поста , но это, очевидно, означает, что мне нужно редактировать этот скрипт вручную каждый раз, когда я хочу использовать его для новой папки без автозаполнения. У меня много вещей, которые можно классифицировать, так что это просто невозможно.

1 Ответ

0 голосов
/ 02 апреля 2020

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

for index in {28..54}; do ln "/home/user/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_0${index}_(DVD_480p)_(a-S)_("*").mkv" "/home/user/archive/_DATA_ARCHIVE/_video_storage/Anime/Shows/Example/Season 2/Example S2E0${index}.mkv"; done

Итак, у меня было кто-то выручил, и, к счастью, я смог ее решить.

Сначала мы используем -r в команде read, чтобы не анализировать escape-символы.

Затем мы присваиваем lnFrom и lnTo без кавычек:

lnFrom=$from$formatOldStart$currentEpisodeNumber$formatOldEnd
lnTo=$to$formatNewStart$currentEpisodeNumber$formatNewEnd

Затем мы используем eval в команде ln для анализа переменных:

eval ln "$lnFrom" "$lnTo"

Теперь да, я понимаю проблемы с eval из-за того, что это проблема безопасности, но этот скрипт работает в закрытой сети у меня дома, поэтому мне все равно.

Если кто-то может предоставить решение, которое работает без Eval, я был бы более чем счастлив принять этот ответ.

Извините, если это было очевидно для многих из вас. Я знаком с JavaScript на работе, но я не очень знаком с bash / unix, кроме команд basi c для обхода ОС.

...