Как извлечь только названия всех родительских каталогов из массива с путями?

Как использовать средства bash для получения массива с родительскими каталогами верхнего уровня из другого массива, содержащего перечень измененных файлов в github action?
  • 9 августа 2024 г. 11:03
Ответы на вопрос 2
Для извлечения только названий всех родительских каталогов из массива с путями в bash можно воспользоваться следующим скриптом:

```bash
#!/bin/bash

paths=("path/to/file1.txt" "folder1/folder2/file2.txt" "folder3/file3.txt")
parent_dirs=()

for path in "${paths[@]}"; do
    parent_dirs+=("$(dirname "$path")")
done

echo "${parent_dirs[@]}"
```

С помощью этого скрипта мы создаем массив `parent_dirs`, в который добавляем только названия родительских каталогов с помощью команды `dirname`.

Для получения массива с родительскими каталогами верхнего уровня из другого массива, содержащего перечень измененных файлов в github action, можно воспользоваться следующим скриптом:

```bash
#!/bin/bash

changed_files=("path/to/file1.txt" "folder1/folder2/file2.txt" "folder3/file3.txt")
parent_dirs=()

for file_path in "${changed_files[@]}"; do
    parent_dir=$(dirname "$file_path")
    while [ "$parent_dir" != "/" ]; do
        parent_dirs+=("$parent_dir")
        parent_dir=$(dirname "$parent_dir")
    done
done

unique_parent_dirs=($(echo "${parent_dirs[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
echo "${unique_parent_dirs[@]}"
```

Этот скрипт будет извлекать список всех родительских каталогов для каждого измененного файла, а затем убирать дубликаты с помощью команды `sort -u`.
#!/bin/bash
ALL_CHANGED_FILES='[
  "monorepo/spfx-packages/news/src/webparts/news",
  "monorepo/spfx-packages/news/config",
  "monorepo/spfx-packages/news",
  "monorepo/spfx-packages/news/src/webparts/news/loc",
  "monorepo/spfx-packages/alert/src/webparts/alert",
  "monorepo/spfx-packages/alert/config",
  "monorepo/spfx-packages/alert",
  "monorepo/spfx-packages/alert/src/webparts/alert/loc"
]'
echo "$ALL_CHANGED_FILES" | sed -rn 's@([^/]+/[^/]+/[^/]+)/.+@\1"@p' | sort -u | sed -r '$!s/.+/&,/'
Похожие вопросы