Я использую git diff для возврата имен недавно измененных файлов, и я пытаюсь передать возвращенные имена файлов в выражение grep, которое ищет каждый файл и возвращает файлы, которые имеют «*.yml» в имени файла и "- имя:" в самом файле. Однако похоже, что мой код возвращает только все файлы в каталоге, соответствующие условиям, в основном игнорируя git diff.
files=($(git -C ${dir} diff --name-only HEAD^ HEAD | grep -rlw --include = "*.yml" --exclude-dir=$excluded -e "- name:"))
Любая помощь будет оценена!
Обновлено: Решено! Удалив рекурсию и установив для git diff другую переменную, был возвращен правильный список.
git_diff_files=($(git -C ${prov_dir} diff --name-only HEAD^ HEAD))
changed_files_full=($(printf "${dir}/%s " "${git_diff_files[@]}" ))
changed_files_ansible=($(find "${changed_files_full[@]}" -type f -print0 | xargs -0 grep -lw --include = "*.yml" --exclude-dir = "$excluded" -e "- name:"))
grep -rlw --include = "*.yml" --exclude-dir=$excluded -e "- name:": В этой части все идет не так. Здесь вы указываете grep рекурсивно искать шаблон «- name:» в файлах, которые заканчиваются на «.yml», и в каталогах, не входящих в $excluded. Однако эта команда grep на самом деле не получает вывод команды git. Это просто поиск по всем файлам в текущем каталоге.





Используйте это, используя лучшие практики для подачи массива и избегайте формы:
arr=( $(cmd) )
вместо этого используйте:
read -ra files < <(
git -z -C "$dir" diff --name-only HEAD^ HEAD | grep -z '\.yml$'
)
printf '%s\n' "${files[@]}"
-z из git и grep предназначены для анализа даже файлов с символами новой строки или специальными символами.
Вы передаете свой список файлов в grep, но в рекурсивном режиме grep игнорирует стандартный ввод и выполняет рекурсивный поиск, начиная с текущего каталога... Попробуйте
files=($(git ...)); grep ... "${files[@]}".