Использование подстановочного знака для сопоставления пути к файлу bash

#bash #wildcard #glob

#bash #подстановочный знак #глобус

Вопрос:

белый список. Будет задан в виде массива

whitelist=(assets/**/* config/mapel-syrup/*/bla-web/**/*)

 assets/**/*
config/mapel-syrup/*/bla-web/**/*
  

путь к файлу, который должен совпадать. Будет задан в виде массива.

paths=(config/mapel-syrup/common/bla-web/list/file1.log.json config/mapel-syrup/alpine/bla-web/file2.log.json assets/dire1/file3.json)

 config/mapel-syrup/common/bla-web/list/file1.log.json
config/mapel-syrup/alpine/bla-web/file2.log.json
assets/dire1/file3.json
  

путь к файлу, который не должен совпадать.

 config/mapel-syrup/common/not-match/file4.json
assets/mapel-syrup/makelists/aus/MakeLists.txt
  

Я пытаюсь реализовать функцию белого списка с помощью скрипта bash. Мне дан массив whitelist каталогов. Вызывается второй массив paths , который содержит все файлы, подлежащие изменению. Задача проста, проверьте, совпадают ли пути с белым списком, затем выполните echo match, иначе ничего не делайте.

Я пытался найти некоторые решения в SO, но ни одно из них не соответствует имеющимся у меня шаблонам. Может ли эксперт помочь мне с этим?

Ответ №1:

 paths=(config/mapel-syrup/common/bla-web/list/file1.log.json config/mapel-syrup/alpine/bla-web/file2.log.json assets/dire1/file3.json)
whitelist=(assets/**/* config/mapel-syrup/*/bla-web/**/*)
for p in ${paths[@]}; do
  echo $p
  match=0
  for w in ${whitelist[@]}; do
    [[ $p == $w ]] amp;amp; match=1
  done
  if [[ $match -eq 1 ]]; then
    echo matches
  else
    echo "no match"
  fi
done
  

Пример вывода:

 config/mapel-syrup/common/bla-web/list/file1.log.json
matches
config/mapel-syrup/alpine/bla-web/file2.log.json
no match
assets/dire1/file3.json
matches
  

Комментарии:

1. Вы уверены, что получаете совпадения, нет совпадений и совпадений? Я не получаю совпадений только с конфигурацией / mapel-syrup/common/bla-web/list/file1.log.json нет совпадений с конфигурацией /mapel-syrup/alpine/bla-web/file2.log.json нет совпадений с активами / dire1/file3.json нет совпадений

2. Я скопировал содержимое скрипта и выходные данные как есть из bash 4.2.46 (2) на RHEL7.8. Похоже, что редактирование triplee нарушило сценарий. Моя оригинальная версия без кавычек работает нормально. Я посмотрю, смогу ли я восстановить исходную версию.

3. @triplee: я понимаю, что вы, вероятно, хотели добавить кавычки из лучших практик. Но я предполагаю, что он ломается, потому что сценарий полагается на глобализацию пути. Я не изучал детали, но код, опубликованный изначально, работает, но не работает при добавлении кавычек.

4. Рад слышать, что это работает. Надеюсь, тогда вы примете мой ответ.