Bash: 일부 디렉토리를 제외한 모든 디렉토리를 변수에 추가

Bash: 일부 디렉토리를 제외한 모든 디렉토리를 변수에 추가

다음과 같은 변수에 디렉토리를 추가하고 싶습니다.

   WATCHED_DIR="\
      someDir_1/* \
      someDir_2/* \
      someDir_3/* \

각 디렉토리에는 많은 하위 디렉토리가 있으며 대부분의 경우 괜찮습니다. 하지만 이제 제외하려는 하위 디렉터리 목록이 포함된 변수를 만들고 싶습니다.

예를 들어:

EXCLUDED_DIRS:"\
        someDir_2/docs/ \
        someDir_3/docs/ "

제외 부분을 어떻게 해야 할지 모르겠습니다.

업데이트: 내가 달성하려는 작업을 명확히 하기 위해 다음 코드 조각을 사용하면 더 잘 이해할 수 있습니다.

# Add directories to watch
WATCH_FILES="\
.github/workflows/ci-tests/Examples_tests \
Examples/MCU1/BLE \
Examples/MCU1/Bootloader \
Libraries/libs.mk \
Libraries/Cordio/* \
Libraries/CMSIS/Device/MCU1 \
Libraries/PeriphDrivers/ \\
Libraries/BlePhy/ \
Libraries/Boards/"
#remove unwanted sub-directories
IGNORED_DIRS="\ 
            Libraries/Cordio/docs \
            Libraries/Cordio/controller"

for ignored_dir in $IGNORED_DIRS; do
  # some how remove from watch files
done

WATCH_FILES를 인쇄하면 Cordio 내의 모든 하위 디렉터리를 얻을 수 있는데 삭제할 수 있어서 좋다고 생각합니다. Cordio에서 *를 제거하면 문자열에 하위 디렉터리가 표시되지 않습니다. 원하는 최종 결과는 무시된 하위 디렉터리를 포함하지 않는 WATCH_FILES를 얻는 것입니다.

깨끗한 WATCH 파일 목록을 사용하여 git diff를 수행하고 해당 WATCH 파일 디렉터리에 변경된 파일이 있는지 확인합니다.

답변1

이미 언급하셨으니 bash배열을 사용하는 것이 좋습니다. 또한 삭제할 디렉터리를 쉽게 식별할 수 있도록 연관 배열을 사용하여 무시할 디렉터리를 보관하겠습니다. results()나중에 꼭 필요한 경우 배열을 개행으로 구분된 목록으로 축소할 수 있습니다.

watched목록이 실제 상황과 일치하는 디렉터리에서 이 코드를 실행하세요 ignored. 이렇게 하면 glob이 Libraries/Cordio/*실제 디렉토리 목록으로 확장될 수 있습니다. 그렇지 않으면 와일드카드와 일치하는 디렉토리 목록을 얻을 수 없습니다. 이는 디렉토리 세트가 인식되지 않음을 의미합니다.그건 아니야제외된.

#!/bin/bash
shopt=$(shopt -p nullglob)    # Save nullglob setting
shopt -s nullglob             # Enable nullglob

# Directories to watch
declare -a watched=(
    .github/workflows/ci-tests/Examples_tests
    Examples/MCU1/BLE
    Examples/MCU1/Bootloader
    Libraries/libs.mk
    Libraries/Cordio/*
    Libraries/CMSIS/Device/MCU1
    Libraries/PeriphDrivers
    Libraries/BlePhy
    Libraries/Boards
)

# Directories to ignore
declare -a ignored=(
    Libraries/Cordio/docs
    Libraries/Cordio/controller
)

# Reset shopt nullglob
$shopt                        # Revert nullglob

# Work starts here

# Create an associative array for ignored()
declare -A aignored=()
for ignore in "${ignored[@]}"; do aignored["${ignore%/}"]=1; done

# Copy the working directory list, skipping entries in ignored()
declare -a results=()
for watch in "${watched[@]}"; do test -v aignored["${watch%/}"] || results+=("${watch%/}"); done

# Print the resulting array, separated by newlines, in sorted order
printf '%s\n' "${results[@]}" | sort

귀하의 예의 결과입니다. 실제로 는 , 및 Libraries/Cordio4개의 디렉토리가 있다고 가정합니다 .adirectorydocscontrollersomedirectorytokeep

.github/workflows/ci-tests/Examples_tests
Examples/MCU1/BLE
Examples/MCU1/Bootloader
Libraries/BlePhy
Libraries/Boards
Libraries/CMSIS/Device/MCU1
Libraries/Cordio/adirectory
Libraries/Cordio/somedirectorytokeep
Libraries/PeriphDrivers
Libraries/libs.mk

이 예(특히 마지막 예 printf | sort)에서는 디렉터리 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. 가능하다면 NULL로 끝나는 문자열을 사용하거나 결과 목록을 조작할 수 있습니다.

관련 정보