Несколько параметров поиска exe c: командная строка индекса synology - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу проиндексировать некоторые файлы на моем NAS после перемещения их в нужную папку. Моя команда будет выглядеть примерно так:

find *.$ext -exec mv "{}" $path \; -exec synoindex -a $(echo $path)$(basename "{}") \;

Первая часть работает. Все файлы с расширением $ ext перемещаются в целевой путь $. Но вторая часть, которая должна индексировать эти файлы в их новой папке $ path, не работает.

Это странно, потому что:

  • {} содержит правильное значение = > полный старый путь каждого обработанного файла. Чтобы убедиться в этом, я добавил третью часть, которая выполняет только: -exe c echo {} \;
  • Выполнение отдельно $ (echo $ path) $ ( Базовое имя "{}") работает, после замены {} на одно действительное
    значение, принятое для примера =>, дает полный новый синтаксис пути => правильный синтаксис
  • Отдельное выполнение synoindex -a $ (echo $ path) $ (basename "{}") работает, после замены {} на одно действительное значение, принятое для примера => команда верна

Спасибо за любую идею.

С уважением,

1 Ответ

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

Подстановки вашей команды $(echo $path) и $(basename "{}") выполняются вашей оболочкой до выполнения find. И вам не нужно echo переменная $path. Вместо этого вы можете выполнить небольшой сценарий оболочки:

find . -type f -name "*.$ext" -exec sh -c '
  targetpath=$1; shift # get the value of $path
  for file; do
    mv -i "$file" "$targetpath"
    synoindex -a "$targetpath/${file##*/}"
  done
' sh "$path" {} +

Запускается find в текущем каталоге ., поиск обычных файлов (-type f), заканчивающийся расширением $ext (* 1013) *) и выполняет небольшой скрипт оболочки, передавая переменную $path в качестве первого аргумента скрипту. Следующие аргументы - это пути к файлам, найденные find.

Расширение параметра ${file##*/} удаляет самый длинный префикс */ из файла, и результатом является базовое имя. Если ваша переменная $path уже содержит конечный sla sh /, пропустите / после $targetpath.

...